带有JDialog的JLayeredPane

时间:2012-11-29 23:23:40

标签: java swing jdialog jlayeredpane

在将JLayeredPane添加到JDialog时,我无法在JLayeredPane上创建任何组件。

我也无法找到一个显示可以在合理大小的代码块中完成此操作的Web资源。每一次观察都会看到“声称”,这可以做到,然后展示一个令人作呕的长期解决方案。

我想要的是在JLayered窗格中添加一个Button并将带有图标的JLabel放入此窗格中。在英语中我想要一个带有图标的按钮卡在文本的前面。

这就是awt Button,因为我一直无法找到一种让系统看起来像JButton的方法。

编辑:你能帮我解决一些更具体的问题吗?在我的帖子中,我认为我是一个模糊不清的人。

Button button = new Button("ok");
JDialog dialog = new JDialog(null,"Windows",Dialog.ModalityType.APPLICATION_MODAL);
dialog.getLayeredPane().add(button);
dialog.pack();
dialog.setVisible(true);

2 个答案:

答案 0 :(得分:4)

这个example似乎与添加到构造函数中的以下行一起使用:

this.addMouseListener(new MouseHandler(this));
this.add(new JLabel("Label"));
this.add(new JButton(UIManager.getIcon("html.pendingImage")));

enter image description here

答案 1 :(得分:4)

我似乎没有任何问题......

public class TestLayeredDialog {

    public static void main(String[] args) {
        new TestLayeredDialog();
    }

    public TestLayeredDialog() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setLayout(new BorderLayout());
                dialog.add(new MyContent());
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);

                System.exit(0);
            }
        });
    }

    public class MyContent extends JLayeredPane {

        public MyContent() {
            JLabel label = new JLabel("Hello new world");
            label.setSize(label.getPreferredSize());
            label.setLocation(0, 0);
            add(label);

            Dimension size = getPreferredSize();

            JButton button = new JButton("Click me");
            button.setSize(button.getPreferredSize());
            button.setLocation(size.width - button.getWidth(), size.height - button.getHeight());
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    SwingUtilities.getWindowAncestor(MyContent.this).dispose();
                }
            });
            add(button);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

请记住,JLayeredPane没有布局管理器。您负责管理子组件的大小和位置,这就是重点。

更新了新示例

enter image description here

public class TestLayeredDialog {

    public static void main(String[] args) {
        new TestLayeredDialog();
    }

    public TestLayeredDialog() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setLayout(new BorderLayout());

                JLabel label = new JLabel("Hello new world");
                label.setSize(label.getPreferredSize());
                label.setLocation(0, 0);
                dialog.getLayeredPane().add(label, new Integer(1));

                dialog.setSize(100, 100);
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);

                System.exit(0);
            }
        });
    }
}

JRootPane的分层窗格负责(除此之外)布局内容窗格和菜单栏。它也用于(在某些情况下)显示弹出窗口等内容。

enter image description here

阅读How to Use Root Panes

  

您可以选择将组件放在根窗格的分层窗格中。如果   你这样做,那么你应该知道某些深度被定义为   用于特定功能,您应该使用深度   意。否则,您的组件可能无法正常使用   其他。这是一个显示功能层及其功能的图表   关系:

使用此功能,意味着您正在与屏幕上已有的组件竞争。

除非你有充分的理由去弄乱这个组件,否则我建议你避免使用它1-将来可能会被改变(组件的层位置)和2-它可能会干扰其他组件由Swing API使用