java:在另一个线程中执行showoptiondialog,然后从中退出会关闭整个应用程序

wfypjpf4  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(357)

我实现了以下代码,以便在我的程序执行任务时,在另一个线程中使用java中的swing运行对话事件。

public class othermain implements Runnable {

    public void displayDialog() {
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Insert text");
        TextField text = new TextField(15);
        panel.add(label);
        panel.add(text);
        String[] options = new String[]{"Cancel", "Ok"};
        int option = JOptionPane.showOptionDialog(null, panel, "Ask",
                JOptionPane.NO_OPTION, JOptionPane.NO_OPTION,
                null, options, options[1]);
        if (option == 1) {
            System.out.println(text.getText());

        }
    }

    @Override
    public void run() {
        this.displayDialog();
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        othermain a = new othermain();
        //a.load();
        Thread th = new Thread(a);
        th.start();

        while (true) {
            System.out.println("I should never exit from the cycle");
            Thread.sleep(3000);
        }
    }
}

这是可行的,但问题是,在macos上,一旦打开对话框,程序的图标仍保留在dock中,因此当我试图关闭它时,即使对话框已在另一个线程中执行,我的整个应用程序也会关闭。换句话说,我希望只有在按下ok按钮或cancel按钮之后,执行对话的线程才会关闭。我怎样才能避免所描述的行为,并使图标隐藏,只显示消息框,而不是图标的程序太,使它不能被手动关闭?或者,如果手动退出应用程序时无法避免这种情况,则应仅关闭正在执行该应用程序的线程,而不是关闭整个应用程序。
电流输出:

I should never exit from the cycle
I should never exit from the cycle
I should never exit from the cycle
text
I should never exit from the cycle

Process finished with exit code 0 //When I quit the application from the dock

wmtdaxz3

wmtdaxz31#

对于那些想知道这个问题的人,我用这个技巧解决了。

System.setProperty("apple.awt.UIElement", "true");
java.awt.Toolkit.getDefaultToolkit();

主要更新:

//Code for messagebox is the same 

public static void main(String[] args) throws IOException, InterruptedException {
    System.setProperty("apple.awt.UIElement", "true");
    java.awt.Toolkit.getDefaultToolkit();
    othermain a = new othermain();
    a.displayDialog();
    //Thread th = new Thread(a); //You don't need to run in a separated thread now
    //th.start();
    while (true) {
        System.out.println("I should never exit from the cycle");
        Thread.sleep(3000);
    }
}

特别感谢用户告诉我“遵循java约定”,而不添加任何关于这个问题的额外词汇。他帮了我很多,就像很多回答他问题的用户一样。

相关问题