在插件中使用时如何防止JDialog冻结?

时间:2014-07-30 19:35:07

标签: java swing plugins freeze jdialog

我正在尝试创建一个对话框来获取数据库插件的用户信息,我需要收集多个字段并将提示样式化以便以某种方式显示。我正在使用JDialog这样做(我正在替换预先存在的对话,这样做只收集了一个字段)。新的对话框构造良好并且出现,但随后冻结(变得无法响应)以及我编码的java插件所在的数据库软件。

作为参考,这里是正在使用的旧对话框代码,它完美地工作并且没有任何问题地返回输入字段(它包含一堆本地化字符串,但为了完成我将它们留在那里):

InputDialog dlg = new InputDialog(window.getShell(), rb.getString("com.transcendata.ipemsoa.MainAsync.lblTitle"), rb.getString("datasetName"),rb.getString("DefaultDatasetName"), null);

这是我试图用以下代码替换它的代码:

Object multiTest[] = { "Top Test", new JButton("Some Button"), new JSlider(), "Bottom Test"};
JOptionPane optionPane = new JOptionPane();

optionPane.setMessage(multiTest);
optionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);

JDialog dialog = optionPane.createDialog(null, "Width 100");

dialog.setVisible(true);

第一个参数不接受" window.getShell()"作为父参数(它不是组件类型,不能被组合成一个),并且我不确定如何将它作为父级将其作为数据库软件的父级,或者如果它甚至可以解决问题。是否有替代解决方案,或者我是否需要以不同方式调用JDialog以防止其停止程序?

1 个答案:

答案 0 :(得分:3)

.setVisible(true)是一个阻塞调用。它将占用调用它的线程,直到对话框关闭。您需要在Swing EDT(事件调度线程)上运行UI元素。我会链接官方教程,但这个网站是关于外部链接的肛门,并且读取不能被浓缩。

这样做:

SwingUtilities.invokeLater( 
    new Runnable() { 
        @Override public void run() {
            dialog.setVisible(true);
        }
    }
);