当前位置: 首页 > 知识库问答 >
问题:

从头开始创建模态对话框

桂宏旷
2023-03-14

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

我一直在浏览各种Java源文件,如JOptionPaneJDialog,以弄清楚它们做了什么来阻止线程,直到用户关闭对话框,但我没有设法理解它。此外,我尝试了各种代码片段,包括EventQueue,例如EventQueue.invokeLaterEventQueue.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();
}

这是它的样子(请注意:覆盖对话框本身不是窗口,而是主窗口中的窗格):

决赛成绩

共有2个答案

金兴朝
2023-03-14

我通过从< 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;
    }
}
姚智
2023-03-14

查看< 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就足够了?下一步