我正在开发一个应用程序,当某个动作发生时会弹出一个 JOptionPane。我只是想知道当 JOptionPane 确实弹出时是否有可能您仍然可以使用后台应用程序。目前,当 JOptionPane 弹出时,在关闭 JOptionPane 之前我不能做任何其他事情。
编辑
感谢各位大侠的回复和信息。认为将这个功能排除在应用程序之外,因为它看起来可能比必要的更麻烦。
我正在开发一个应用程序,当某个动作发生时会弹出一个 JOptionPane。我只是想知道当 JOptionPane 确实弹出时是否有可能您仍然可以使用后台应用程序。目前,当 JOptionPane 弹出时,在关闭 JOptionPane 之前我不能做任何其他事情。
编辑
感谢各位大侠的回复和信息。认为将这个功能排除在应用程序之外,因为它看起来可能比必要的更麻烦。
文档明确指出所有对话框在通过 showXXXDialog 方法创建时都是模态的。
您可以使用的是从文档中获取的 Direct Use 方法和 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;
您应该可以在这里获得更多信息:http: //download.oracle.com/javase/tutorial/uiswing/components/dialog.html
对话框可以是模态的。当模态对话框可见时,它会阻止用户对程序中所有其他窗口的输入。JOptionPane 创建模态的 JDialog。要创建非模态对话框,必须直接使用 JDialog 类。
从 JDK6 开始,您可以使用 新的 Modality API修改对话框窗口的模态行为。有关详细信息,请参阅新模式 API。
这个简单的调整对我有用(1.6+)。将 showXXXDialog 替换为四行代码:(1) 创建 JOptionPane 对象 (2) 调用其 createDialog() 方法以获取 JDialog 对象 (3) 将 JDialog 对象的模态类型设置为无模式 (4) 设置可见性JDialog 为真。
在您的 Java 应用程序中,我认为您不走运:我没有检查,但我认为 JOptionPane 的 showXXXDialog 方法会弹出一个所谓的模式对话框,使 GUI 的其余部分与同一个 JVM 处于非活动状态。
但是,Java 没有任何吸引前景的超能力:您仍然应该能够通过 Alt-Tab 键访问其他(非 Java)应用程序。
@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);