Java swing中的重叠组件

Java swing中的重叠组件,java,swing,Java,Swing,我正在开发一个应用程序来设计一个关键系统。主界面由一个复选框“矩阵”组成,显示锁和钥匙之间的对应关系。可以为每个锁和钥匙指定一个名称,以帮助将它们分发给相应的所有者。为了节省空间,我想稍微倾斜一下锁定名称的文本框 我最初的尝试显示在屏幕截图中(边框涂成红色),以及我的目标图。该类允许我旋转字段,目前字段的位置完全没有布局管理器 问题是,旋转后的文本字段似乎有一个不透明的“背景”,以随机方式遮挡了其他文本字段。我不确定这是JXTTransformer的产物,还是Swing中的组件不可能重叠 我

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

我最初的尝试显示在屏幕截图中(边框涂成红色),以及我的目标图。该类允许我旋转字段,目前字段的位置完全没有布局管理器

问题是,旋转后的文本字段似乎有一个不透明的“背景”,以随机方式遮挡了其他文本字段。我不确定这是JXTTransformer的产物,还是Swing中的组件不可能重叠

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


编辑:只是澄清一下,布局是冻结的,不需要调整大小。

这在某种程度上取决于您使用的Java版本。Alexander Potochkin编写了一个名为JXLayer的库,可用于Java7之前的版本。您可以在此处找到有关这方面的简短介绍:

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

基本上你能做的就是在你的组件上写一个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();
        }
    }
}

import java.awt.*;
导入javax.swing.*;
导入javax.swing.plaf.LayerUI;
/**
*在Java7中使用{@link JLayer}进行旋转的示例。
*/
公共类倾斜方法{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame(“倾斜组件”);
LayerUI LayerUI=新的RotateUI();
JPanel panel=new MyPanel();
JLayer JLayer=新JLayer(面板,层);
frame.getContentPane().add(jLayer);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
框架设置最小尺寸(新尺寸(800450));
frame.setLocationRelativeTo(null);//中心
frame.pack();
frame.setVisible(true);
}
});
}
静态类MyPanel扩展了JPanel{
我的小组(){
添加(新JLabel(“Hello”);
添加(新JLabel(“世界”);
}
}
静态类RotateUI扩展了LayerUI{
@凌驾
公共空隙涂料(图形g、J组件c){
Graphics2D g2=(Graphics2D)g.create();
g2.旋转(0.4);
超级油漆(g2,c);
g2.dispose();
}
}
}