我正在尝试为用户单击按钮时打开的覆盖对话框创建自己的实现。 您在下面看到的代码可以很好地工作,但不是那么漂亮。 我正在寻找一种实现,无需为我创建的每个对话框都创建线程。 有什么办法可以做到这一点?
我一直在浏览各种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();
}
外观如下所示(请注意:覆盖对话框不是窗口本身,而是主窗口中的窗格):
最后结果