-1

将 JLayeredPane 添加到 JDialog 时,我无法使任何组件出现在 JLayeredPane 上。

我也一直无法找到显示这可以在合理大小的代码块中完成的网络资源。iv 看到的每一个景象都“声称”这是可以做到的,然后显示了一个令人作呕的长解决方案。

我想要的是在一个 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);
4

2 回答 2

4

示例似乎适用于添加到构造函数的以下行:

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

在此处输入图像描述

于 2012-11-29T23:36:27.540 回答
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没有布局管理器。您将负责管理子组件的大小和位置,这就是重点。

更新了新示例

在此处输入图像描述

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负责(除其他外)布置内容窗格和菜单栏。它还用于(在某些情况下)显示弹出窗口等内容。

在此处输入图像描述

阅读如何使用根窗格

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

使用它意味着您正在与屏幕上已经存在的组件竞争。

除非你有很好的理由来搞乱这个组件,否则我建议你避免它,因为 1- 将来可能会更改(组件的层位置)和 2- 它可能会干扰使用的其他组件摆动 API

于 2012-11-29T23:42:55.693 回答