在Swing JDialog中删除“X”button
有没有办法从JDialog
标题栏中删除closuresbutton(“X”)?
您可以通过调用dialog.setUndecorated(true)来删除整个对话框标题,但这意味着对话框不能再被移动。
你也可以执行dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)来防止button做任何事情。
除此之外,我不认为有一种方法可以彻底删除X.
我相信你可以调用dialog.setUndecorated(true)
来删除标题栏。 不知道只是'X'。
但是,删除'X'可能不是一个好主意,因为您希望用户能够轻松地closures对话框。
最好的办法是控制用户使用dialog.setDefaultCloseOperation
或WindowListener
单击“X”时发生的情况。
从Java 1.7(AKA Dolphin或Java 7)开始,您无法禁用或移除窗口上的closuresbutton。 您可以使用frame.setResizable(false)
删除/禁用最大化button,您可以通过使用java.awt.Dialog
或扩展它的类(如javax.swing.JDialog
frame.setResizable(false)
来移除最小化和最大化button。 您可以使用frame.setUndecorated(true)
删除标题栏,边框和button,并且可以完全控制标题栏中所有button的可见性(同时丢失一些跨平台兼容性和操作系统集成) frame.setDefaultLookAndFeelDecorated(true)
(假设它是一个JFrame或JDialog)。 这是目前JDK所能实现的所有控制。
这是我的经验:
- 尝试使用
setUndecorated(true)
:使整个Dialog
不可见。 - 尝试
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
:这并没有改变行为。 我的对话框仍然closures。 将默认closures操作设置为DO_NOTHING_ON_CLOSE
将close操作委托给已注册WindowListener
的windowClosing()
方法。
对我有效的是:
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); //Remove any existing WindowListeners for ( WindowListener wl : this.getWindowListeners()) this.removeWindowListener(wl); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if ("Optional condition") { JOptionPane.showMessageDialog(null, "You cannot close this window"); } } });
根据猜测,将其设置为PL&F装饰,并按名称删除组件。
static public void removeButtons(Component c){ if (c instanceof AbstractButton){ String accn = c.getAccessibleContext().getAccessibleName(); Container p=c.getParent(); //log.debug("remove button %s from %s",accn,p.getClass().getName()); c.getParent().remove(c); } else if (c instanceof Container){ //log.debug("processing components of %s",c.getClass().getName()); Component[] comps = ((Container)c).getComponents(); for(int i = 0; i<comps.length; ++i) removeButtons(comps[i]); } }