2

我正在开发一个应用程序来设计一个关键系统。主界面由一个复选框“矩阵”组成,显示锁和钥匙之间的对应关系。可以为每个锁和钥匙命名,以帮助将它们分配给适当的所有者。为了节省空间,我想稍微倾斜一下锁名称的文本框。

目前的混乱 目标

我最初的尝试显示在屏幕截图中(边框涂成红色),以及我的目标的绘图。JXTransformer类让我可以旋转字段,现在字段只是绝对定位,没有布局管理器。

问题是旋转的文本字段似乎有一个不透明的“背景”,它以随机的方式模糊了其他文本字段。我不确定这是否是 JXTransformer 的产物,或者是否根本不可能在 Swing 中让组件重叠。

我非常感谢任何帮助或证明这确实是不可能的。

编辑:为了澄清,布局被冻结,不需要调整大小。

4

1 回答 1

1

这在一定程度上取决于您使用的 Java 版本。Alexander Potochkin 编写了一个名为 JXLayer 的库,您可以将其用于 Java 7 之前的版本。您可以在此处找到对此的简短介绍: JXLayer 简介

这已经演变成 JLayer,您现在可以在 Java 7 中找到它。您可以在以下页面上找到一些基本演示: JLayer 视频

基本上你可以做的是在你的组件之上编写一个 UI,它会进行 2D 旋转。我过去曾成功地使用过这种方法。

在此处输入图像描述

import java.awt.*;

import javax.swing.*;
import javax.swing.plaf.LayerUI;

/**
 * Example of rotation using {@link JLayer} in Java7.
 */
public class TiltedApproach {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Tilted components");
                LayerUI<JComponent> layerUI = new RotateUI();
                JPanel panel = new MyPanel();
                JLayer<JComponent> jLayer = new JLayer<JComponent>(panel, layerUI);
                frame.getContentPane().add(jLayer);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setMinimumSize(new Dimension(800, 450));
                frame.setLocationRelativeTo(null); // Center
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static class MyPanel extends JPanel {

        MyPanel() {
            add(new JLabel("Hello"));
            add(new JLabel("World"));
        }
    }

    static class RotateUI extends LayerUI<JComponent> {
        @Override
        public void paint(Graphics g, JComponent c) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.rotate(0.4);
            super.paint(g2, c);
            g2.dispose();
        }
    }
}
于 2012-11-07T13:58:24.647 回答