我想知道是否可以实现方形但旋转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