2011-06-13 176 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,那么你不必担心面板旋转。