2011-06-13 79 views
11

我想知道是否可以實現方形但旋轉90度的GUI面板(可能是JPanel)。顯然,會有一個包含此面板的頂層容器,而主面板在視覺上就是這個旋轉的方形面板。Java GUI中的旋轉方形面板

更具體地說,我會將一個面板(稱爲'A')分成4個相等的方形子面板,然後用JLabels填充這些子面板,爲此我想使用GridLayout。最後,我會旋轉'A'90度以提供我想要的。

從我閱讀其他類似的問題,似乎你不能旋轉JPanel本身,但你可以旋轉其中包含的內容。這適用於我的情況嗎?希望有人能指出。謝謝。

回答

13

關鍵的事情似乎是在旋轉圖形上下文後繪製組件。這裏有一個例子:

enter image description here

附錄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(); 
      } 
     }); 
    } 
} 
+1

整潔的把戲:)我很好奇它是如何處理對象,你可以點擊,所以也添加了一個按鈕。它畫了它旋轉,但也不旋轉(有時)。此外,面板可以感知以非旋轉方向註冊的任何事件 – Atreys 2011-06-13 17:58:34

+0

@Atreys:好點,儘管解決方案並不重要。我已經詳細闡述過了。 – trashgod 2011-06-13 18:17:58

+0

這很好,但是這種方法一般嗎?例如,如果我只將「A」面板旋轉45度,這是否會使其顯示爲菱形形狀,並且所有內容都旋轉45度(例如標籤,子面板邊緣等)?謝謝。 – skyork 2011-06-14 15:02:12

2

是的,你必須讓頂級容器(JPanel或其他容器)成爲旋轉內容的項目。真的,你不旋轉的項目,你正在旋轉的項目的繪畫。

2

如果你需要做的是在轉動一個JLabel文本你可以使用一個Rotated Icon,那麼你不必擔心面板旋轉。