setUndecorated(true)为从JOptionPane实例创建的JDialog

时间:2013-06-14 03:21:47

标签: java swing

我目前通过调用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()

1 个答案:

答案 0 :(得分:11)

您需要阅读JavaDoc entry on Component#isDisplayable,然后查看创建对话框的源代码

  

“组件在添加到可显示的包含层次结构或其包含层次结构时可显示   可显示。包含层次结构在其可用时可显示   祖先窗口已打包或可见。“

基本上,对话框是作为createDialog方法

的一部分打包的

可能的解决方案

一种可能的解决方案是创建自己的对话框......

enter image description here

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

}