Java GUI中的旋转方形面板

时间:2011-06-13 16:41:45

标签: java swing user-interface awt

我想知道是否可以实现方形但旋转90度的GUI面板(可能是JPanel)。显然,将有一个包含此面板的顶层容器,并且在视觉上主面板是这个旋转的方形面板。

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

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

4 个答案:

答案 0 :(得分: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 :(得分:3)

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

答案 2 :(得分:2)

是的,您必须将顶级容器(JPanel或其他容器)作为旋转内容的项目。你真的没有旋转物品,你正在转动物品的绘画。

答案 3 :(得分:2)

如果你需要做的只是在JLabel上旋转文本,你可以使用Rotated Icon,那么你不必担心旋转面板。