我正在尝试为用户单击按钮时打开的覆盖对话框创建自己的实现。 您在下面看到的代码可以很好地工作,但不是那么漂亮。 我正在寻找一种实现,无需为我创建的每个对话框都创建线程。 有什么办法可以做到这一点?

我一直在浏览各种Java源文件(例如JOptionPane和JDialog以弄清楚它们是如何执行的,以便在用户关闭对话框之前阻塞线程,但我没有设法理解它。 另外,我尝试了各种代码片段,包括EventQueue ,例如EventQueue.invokeLater或EventQueue.invokeAndWait 。

// MainViewController.java

@FXML

private void handleServerButton(ActionEvent evt){

Thread t = new Thread(() -> {

if (serverD.showDialog(overlay) == Dialog.OK_OPTION){

System.out.println("OK");

} else {

System.out.println("ABORT");

}

});

t.start();

}

// Dialog.java

public int showDialog(Pane parent) {

latch = new CountDownLatch(1);

this.result.set(NONE);

approveButton.setDefaultButton(true);

abortButton.setCancelButton(true);

container.setVisible(true);

parent.setVisible(true);

try {

latch.await();

} catch (InterruptedException ex){ }

approveButton.setDefaultButton(false);

abortButton.setCancelButton(false);

container.setVisible(false);

parent.setVisible(false);

return result.get();

}

@Override

public void changed(ObservableValue extends Integer> observable, Integer oldValue, Integer newValue) {

if (newValue != NONE)

latch.countDown();

}

外观如下所示(请注意:覆盖对话框不是窗口本身,而是主窗口中的窗格):

最后结果

aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9idlRoZi5wbmc=

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐