有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java GUI中旋转方形面板

我想知道是否有可能实现一个方形但旋转90度的GUI面板(可能是JPanel)。显然,将有一个顶层容器,其中包含该面板,从视觉上看,主面板是内部旋转的方形面板

更具体地说,我会将一个面板(称为“a”)划分为4个相等的方形子面板,并用jLabel填充这些子面板,我正在考虑使用GridLayout。最后,我会把A旋转90度,得到我想要的

从我阅读的其他类似问题来看,你似乎不能旋转JPanel本身,但你可以旋转其中包含的内容。这适用于我的情况吗?如果有人能指出,我将不胜感激。谢谢


共 (4) 个答案

  1. # 1 楼答案

    如果你只需要在JLabel上旋转文本,你可以使用Rotated Icon,那么你就不用担心旋转面板了

  2. # 2 楼答案

    是的,您必须让顶级容器(JPanel或其他容器)成为旋转内容的项目。实际上,你不是在旋转物品,而是在旋转物品的绘画

  3. # 3 楼答案

    查看java上的SwingHelper项目中的JXTransformer。网此类充当组件装饰器,允许您对组件应用任意仿射变换

  4. # 4 楼答案

    关键的事情似乎是在旋转图形上下文之后绘制组件。下面是一个例子:

    enter image description here

    附录1:正如@Atreys注释所示,旋转的组件是绘制的,但交互效果不佳。如果组件必须保持可用,则还应转换事件坐标。比较这个(相当)更复杂的example镜像组件

    附录2:如果你还需要变换鼠标坐标,这个example可能会有帮助

    附录3:可选地,考虑^ {CD1>}检查的实例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();
                }
            });
        }
    }