在将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);
答案 0 :(得分:4)
这个example似乎与添加到构造函数中的以下行一起使用:
this.addMouseListener(new MouseHandler(this));
this.add(new JLabel("Label"));
this.add(new JButton(UIManager.getIcon("html.pendingImage")));
答案 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
没有布局管理器。您负责管理子组件的大小和位置,这就是重点。
更新了新示例
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-它可能会干扰其他组件由Swing API使用