我想知道是否可以實現方形但旋轉90度的GUI面板(可能是JPanel)。顯然,會有一個包含此面板的頂層容器,而主面板在視覺上就是這個旋轉的方形面板。Java GUI中的旋轉方形面板
更具體地說,我會將一個面板(稱爲'A')分成4個相等的方形子面板,然後用JLabels填充這些子面板,爲此我想使用GridLayout。最後,我會旋轉'A'90度以提供我想要的。
從我閱讀其他類似的問題,似乎你不能旋轉JPanel本身,但你可以旋轉其中包含的內容。這適用於我的情況嗎?希望有人能指出。謝謝。
我想知道是否可以實現方形但旋轉90度的GUI面板(可能是JPanel)。顯然,會有一個包含此面板的頂層容器,而主面板在視覺上就是這個旋轉的方形面板。Java GUI中的旋轉方形面板
更具體地說,我會將一個面板(稱爲'A')分成4個相等的方形子面板,然後用JLabels填充這些子面板,爲此我想使用GridLayout。最後,我會旋轉'A'90度以提供我想要的。
從我閱讀其他類似的問題,似乎你不能旋轉JPanel本身,但你可以旋轉其中包含的內容。這適用於我的情況嗎?希望有人能指出。謝謝。
關鍵的事情似乎是在旋轉圖形上下文後繪製組件。這裏有一個例子:
附錄1:作爲@Atreys評論,旋轉部件被吸引,但不良相互作用。如果組件必須保持可用,則事件座標也應該被轉換。比較這個(相當)更復雜example鏡子組件。
附錄2:如果您還需要轉換鼠標座標,則此example可能會有所幫助。
附錄3:或者,考慮drawString()
實例檢查here。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @see https://stackoverflow.com/questions/6333464 */
public class RotatePanel extends JPanel {
public RotatePanel() {
this.setPreferredSize(new Dimension(320, 240));
this.add(new JLabel("Hello World!", JLabel.CENTER));
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
int w2 = getWidth()/2;
int h2 = getHeight()/2;
g2d.rotate(-Math.PI/2, w2, h2);
super.paintComponent(g);
}
private void display() {
JFrame f = new JFrame("RotatePanel");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new RotatePanel().display();
}
});
}
}
是的,你必須讓頂級容器(JPanel或其他容器)成爲旋轉內容的項目。真的,你不旋轉的項目,你正在旋轉的項目的繪畫。
如果你需要做的是在轉動一個JLabel文本你可以使用一個Rotated Icon,那麼你不必擔心面板旋轉。
在java.net上的SwingHelper項目中檢出JXTransformer。該類充當組件裝飾器,允許您將任意仿射變換應用於組件。
整潔的把戲:)我很好奇它是如何處理對象,你可以點擊,所以也添加了一個按鈕。它畫了它旋轉,但也不旋轉(有時)。此外,面板可以感知以非旋轉方向註冊的任何事件 – Atreys 2011-06-13 17:58:34
@Atreys:好點,儘管解決方案並不重要。我已經詳細闡述過了。 – trashgod 2011-06-13 18:17:58
這很好,但是這種方法一般嗎?例如,如果我只將「A」面板旋轉45度,這是否會使其顯示爲菱形形狀,並且所有內容都旋轉45度(例如標籤,子面板邊緣等)?謝謝。 – skyork 2011-06-14 15:02:12