Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在JPanel中无需轮询即可获取所选选项_Java_Swing_Concurrency_Future_Completion Service - Fatal编程技术网

Java-在JPanel中无需轮询即可获取所选选项

Java-在JPanel中无需轮询即可获取所选选项,java,swing,concurrency,future,completion-service,Java,Swing,Concurrency,Future,Completion Service,我有一个JPanel,它以非常类似于JOptionPane.showMessageDialog(…)的方式引用另一个JPanel。但是我不使用这个选项,因为我想更改大小、消息、按钮位置以及其他一些东西。但是最终的实用程序必须是相同的,在选择选项后立即返回所选选项。问题是,我不想轮询一个可能被初始化为null的属性,直到它从actionPerformed(…)方法更改。相反,我曾想过以某种方式使用CompletionService,但我无法准确地思考如何做到这一点。我该如何定义它?因为我想未来的必

我有一个JPanel,它以非常类似于
JOptionPane.showMessageDialog(…)
的方式引用另一个JPanel。但是我不使用这个选项,因为我想更改大小、消息、按钮位置以及其他一些东西。但是最终的实用程序必须是相同的,在选择选项后立即返回所选选项。问题是,我不想轮询一个可能被初始化为null的属性,直到它从
actionPerformed(…)
方法更改。相反,我曾想过以某种方式使用
CompletionService
,但我无法准确地思考如何做到这一点。我该如何定义它?因为我想未来的
必须在
getSelectedOption()
方法中选择,但它必须在
actionPerformed(…)
方法中生成。如何做到这一点?

您可以编写JOptionPane的子类,进行您想要的布局,并且仍然使用返回方法。

最简单的选项是将您的面板嵌入JDialog,它是modal
setModal(true)

通过这种方式,您可以使用一个静态方法来初始化面板,并调用
setVisible(true)
(由于对话框是模态的,所以会阻塞)。然后,一旦用户单击Ok按钮(关闭对话框),您就可以检索所选选项

public static MyOption showMyDialog() {
    final JDialog myDialog = new JDialog();
    myDialog.add(myPanel);
    myDialog.setModal(true);
    myDialog.setVisible(true); // blocker since the dialog is modal

    return myPanel.getSelectedOption();
}

旁注:在您的情况下似乎更合适(它们大致做CompletionService做的事情,但与UI线程的集成更好)。这与我所寻找的解决方案不完全相同,因为我没有停止主GUI线程,但逻辑上结果是一样的。谢谢