我目前通过调用JDialog
实例中的createDialog()
方法创建了JOptionPane
:
JOptionPane pane = new JOptionPane(myPanel, JOptionPane.PLAIN_MESSAGE,JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
dialog = pane.createDialog(null, "");
我希望能够通过将JDialog
调用setUndecorated(true)
从JDialog
删除标题栏,但是当我尝试运行时,我会收到IllegalComponentStateException: The dialog is displayable
异常我的节目。
据我所知,在调用dialog.show()
之前,对话框没有显示,这让我相信在通过pane.createDialog()
远远超出我的对话框实例化对话框时,对话框确实是“可显示的”了解JDialog
API。
我尝试在使用setVisible(false)
之前致电setUndecorated(true)
,但无济于事。
任何帮助都将被理解为如何删除此类JDialog
的标题栏。从普通JDialog
中删除标题栏很容易,从许多其他类型问题的答案中可以看出,但我似乎无法通过{{1}创建的JDialog
工作}。
相关代码:
createDialog()
答案 0 :(得分:11)
您需要阅读JavaDoc entry on Component#isDisplayable,然后查看创建对话框的源代码
“组件在添加到可显示的包含层次结构或其包含层次结构时可显示 可显示。包含层次结构在其可用时可显示 祖先窗口已打包或可见。“
基本上,对话框是作为createDialog
方法
可能的解决方案
一种可能的解决方案是创建自己的对话框......
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Frame;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestOptionPane11 {
public static void main(String[] args) {
new TestOptionPane11();
}
public TestOptionPane11() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JDialog dialog = new JDialog((Frame)null, "Boo");
JOptionPane op = new JOptionPane("Look ma, no hands", JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
op.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String name = evt.getPropertyName();
if ("value".equals(name)) {
dialog.dispose();
}
}
});
dialog.setUndecorated(true);
dialog.setLayout(new BorderLayout());
dialog.add(op);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
});
}
}