JLayeredPane的有一个JDialog(JLayeredPane with a JDialo

2019-07-04 07:01发布

我无法作出其添加到一个JDialog当任何部件上的JLayeredPane apear。

我也一直无法找到网络资源,可显示这可能在代码合理大小的块来完成。 每一幅景象IV看着“索赔”可以做到这一点,然后显示了令人作呕的长期解决方案。

我要的是采取JLayered窗格,在它的图标添加一个按钮,把一个JLabel在此窗格以及。 英语我想停留在其文本的前面有一个图标的按钮。

这是AWT按钮,我一直无法找到制作寻找挥杆的JButton系统的一种方式。

编辑:你可以帮我出一些更具体。 我想我是一个littile含糊在我的岗位。

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

Answer 1:

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

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



Answer 2:

这个例子似乎与添加到构造以下行的工作:

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



文章来源: JLayeredPane with a JDialog