我正在尝试创建一个对话框来获取数据库插件的用户信息,我需要收集多个字段并将提示样式化以便以某种方式显示。我正在使用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以防止其停止程序?
答案 0 :(得分:3)
.setVisible(true)是一个阻塞调用。它将占用调用它的线程,直到对话框关闭。您需要在Swing EDT(事件调度线程)上运行UI元素。我会链接官方教程,但这个网站是关于外部链接的肛门,并且读取不能被浓缩。
这样做:
SwingUtilities.invokeLater(
new Runnable() {
@Override public void run() {
dialog.setVisible(true);
}
}
);