在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.setDefaultCloseOperationWindowListener单击“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操作委托给已注册WindowListenerwindowClosing()方法。

对我有效的是:

 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]); } }