我正在处理一个应用程序,当某个动作发生时会弹出一个JOptionPane。我只是想知道当JOptionPane确实弹出时你是否仍然可以使用后台应用程序。目前,当JOptionPane弹出时,除非关闭JOptionPane,否则我无法执行任何其他操作。
修改
感谢回复人员和信息。认为生病了将此功能从应用程序中删除,因为看起来它可能比必要的更麻烦。
答案 0 :(得分:6)
文档通过showXXXDialog方法明确指出all dialogs are modal。
您可以使用的是从文档中获取的直接使用方法以及JDialog从Dialog继承的setModal方法:
JOptionPane pane = new JOptionPane(arguments);
// Configure via set methods
JDialog dialog = pane.createDialog(parentComponent, title);
// the line below is added to the example from the docs
dialog.setModal(false); // this says not to block background components
dialog.show();
Object selectedValue = pane.getValue();
if(selectedValue == null)
return CLOSED_OPTION;
//If there is not an array of option buttons:
if(options == null) {
if(selectedValue instanceof Integer)
return ((Integer)selectedValue).intValue();
return CLOSED_OPTION;
}
//If there is an array of option buttons:
for(int counter = 0, maxCounter = options.length;
counter < maxCounter; counter++) {
if(options[counter].equals(selectedValue))
return counter;
}
return CLOSED_OPTION;
答案 1 :(得分:2)
您应该可以在此处获得更多信息:http://download.oracle.com/javase/tutorial/uiswing/components/dialog.html
对话框可以是模态的。当一个模态 对话框可见,它会阻止用户 输入到的所有其他窗口 程序。 JOptionPane创建JDialogs 这是模态的。创建非模态 对话框,您必须使用JDialog类 直接
从JDK6开始,您可以修改 使用对话窗口模态行为 the new Modality API。见新 Modality API了解详情。
答案 2 :(得分:1)
在你的Java应用程序中,我认为你运气不好:我没有检查过,但我认为JOptionPane的showXXXDialog方法会弹出一个所谓的模态对话框,它将来自同一JVM的其余GUI保持为非活动状态
然而,Java没有任何前瞻性的超能力:你仍然可以使用Alt-Tab到其他(非Java)应用程序。
答案 3 :(得分:1)
这个简单的调整对我有用(1.6+)。用四行代码替换showXXXDialog: (1)创建一个JOptionPane对象 (2)调用其createDialog()方法来获取JDialog对象 (3)将JDialog对象的模态类型设置为无模式 (4)将JDialog的可见性设置为true。
答案 4 :(得分:1)
@justkt的答案的改进版本,在其注释中建议了事件侦听器。
// A non-modal version of JOptionPane.showOptionDialog()
JOptionPane pane = new JOptionPane(arguments, ...);
pane.setComponentOrientation(JOptionPane.getRootFrame().getComponentOrientation());
JDialog dialog = pane.createDialog((Component)parent, "title");
pane.addPropertyChangeListener(JOptionPane.VALUE_PROPERTY, ignored -> {
Object selectedValue = pane.getValue();
System.out.print("Out of " + Arrays.toString(pane.getOptions()) + ", ");
System.out.println(selectedValue + " was selected");
dialog.dispose();
});
dialog.setModal(false);
dialog.setVisible(true);