我试图创建一个对话框来获取数据库插件的用户信息,并且我需要收集多个字段并以某种方式对提示进行样式化。我正在使用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以防止其停止程序?

最佳答案

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

做这个:

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

07-24 19:29