我正在尝试为用户单击按钮时打开的覆盖对话框创建自己的实现。您在下面看到的代码工作得很好,但不是那么漂亮。我正在寻找一个实现,在这个实现中,我不必为我创建的每个对话框创建一个线程。有没有办法做到这一点?
我一直在浏览各种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();
}
这是它的样子(请注意:覆盖对话框本身不是窗口,而是主窗口中的窗格):
决赛成绩
我通过从< code>Stage派生一个< code>Dialog类并在那里实现逻辑来解决这个问题。唯一剩下的事情就是从视图控制器的控件中提取值。但是我已经注意到对话框是作为窗口通过< code>ActionEvent传递的——所以这应该是个小问题。
public class Dialog extends Stage {
public static int OK_OPTION = 0;
public static int ABORT_OPTION = -1;
private int result;
public Dialog(Scene parent, String url) throws IOException{
super(StageStyle.TRANSPARENT);
Parent root = FXMLLoader.load(getClass().getResource(url));
Scene scene = new Scene(root);
if (System.getProperty("os.name").equals("Mac OS X")){
root.setStyle("-fx-background-radius: 0 0 3px 3px;");
}
scene.setFill(Color.TRANSPARENT);
setScene(scene);
initOwner(parent.getWindow());
double titlebar = parent.getWindow().getHeight() - parent.getHeight();
setX(parent.getWindow().getX());
setY(parent.getWindow().getY() + titlebar + 50);
}
public int showDialog(){
showAndWait();
return result;
}
}
查看< code>Alert和< code>Dialog文档。两者都提供了与你想要的相似的功能,如果它们不完全符合你的用例,也可以定制。
快速示例:
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("title");
alert.setContent("content");
...
// More customisation available, read the docs
alert.show();. // Or showAndWait()
问题内容: 是否可以使用PHP的SimpleXML函数从头开始创建XML对象?浏览功能列表,可以通过一种方法将现有的XML字符串导入到一个对象中,然后可以对其进行操作,但是如果我只是想从头开始以编程方式生成XML对象,什么是最好的方法? 我发现您可以使用simplexml_load_string()并传入所需的根字符串,然后您就可以通过添加子代来操纵对象……尽管这看起来有点像hack,因为我必须实
问题内容: 我正在使用primefaces 3.3.1和JSF 2(Mojarra 2.1.9)。 我有一个包含DataTable组件和Dialog的页面,以显示DataTable条目的详细信息。当我有一个对话框时,这非常简单。我要尝试允许用户同时打开两个或三个带有不同条目详细信息的dailog。有人知道如何从服务器获取整个AJAX对话框,而不仅仅是对话框内容吗? 问题答案: 是的,我做到了。为此
模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是 Qt 所 独有的,在各种不同的平台下都存在。又有叫法是称为模式对话框,无模式对话框等。 所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进 行交互,直到该对话框关闭。对于非模 态对话框,当被打开时,用户既可选择和该对话框进 行交互,也可以选择同应用程序的其他窗口交互。 在 Qt
我已经有了一个DatePicker,当用户单击EditText字段时,它会弹出 出于某种原因,当我把它输入到Android Studio时,“显示对话框”被删除了。 有人能告诉我哪里出了问题吗?还是必须使用自定义的DialogFragment?
问题内容: 我在网上和YouTube上四处查看,出于某种原因,这是一些绝密信息或其他内容,但我试图找出从哪里开始制作Minecraft客户端模块,最好是可以打包的东西例如为用户提供简便性而喂食野兽或技术包,但两种方法都可以。 我将如何创建一个mod?我对eclipse和Java编程本身很熟悉,但是我不知道从哪里开始编写插件。 我曾尝试设置Minecraft Forge,但由于某种原因,它是如此令人
问题内容: 创建对话框的最简单方法是: 在一个窗口中,我提供用于信封寻址的数据,还从尺寸列表中设置字体类型 当单击“确定”时,在同一窗口或下一个窗口中,我将预览到给定名称和使用所选字体大小后的信封外观 它的外观应类似于: 替代文字http://img15.imageshack.us/img15/7355/lab10aa.gif 我应该使用Jdialog吗?还是JOptionPane就足够了?下一步