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

如何防止关闭JDialog关闭整个应用程序

徐翔
2023-03-14

我有一个主(屏幕)gui窗口,需要打开几个“多输入”窗口(jdialog或当不可能使用jframe时),例如添加首选项(4个文本字段,带有2个文件选择器和2个单选按钮)。在这些JDialogs(或JFrames)中按OK/Cancel时,我的整个应用程序将关闭。我不想那样。我该怎么防止呢?

第一次尝试:我尝试了intelliJ选项“新-

第二次尝试:我“手工”编写了一个类,创建了一个JDialog(还尝试了JFrame)。再次:按下其中一个按钮关闭JDialog和我的整个应用程序。

我从JDialog(JFrame)中删除了disuse()和setViable(false)选项,但我的整个应用程序仍然处于关闭状态。

主类方法

public class mainScreen {

    // Menu action listener (only relevant options)
    class MenuActionListener implements ActionListener {

    // menuListener
    public void actionPerformed(ActionEvent ev) {
            //myVariables myVars = new myVariables();
        String[] dummy = null;
            System.out.println("Selected: " + ev.getActionCommand());

            switch(ev.getActionCommand()) {
                case "Preferences":
                    showPreferencesDialog();
                case "Exit":
                    System.exit(0);
                    break;
    }

    // method that opens the external class (see below in following code block)
    private void showPreferencesDialog() {

        prefJDialog myprefs = new prefJDialog(prefsPanel);
        myprefs.showDialog();
        boolean okPressed = myprefs.isOkPressed();
        if (okPressed) {
            JOptionPane.showMessageDialog(mainScreen.this.rootPanel,"OK pressed","About jExifToolGUI",JOptionPane.INFORMATION_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(mainScreen.this.rootPanel,"Cancel pressed","About jExifToolGUI",JOptionPane.INFORMATION_MESSAGE);
        }
    }

    // This is the class which is mention in the manifest
    public mainScreen(JFrame frame) {
        boolean preferences = false;
        Preferences prefs = Preferences.userRoot();

        createmyMenuBar(frame);
        groupRadiobuttonsandListen();
        fileNamesTableListener();
        try {
            myUtils.DisplayLogo(mainScreen.this.iconLabel);
        } catch(IOException ex) {
            System.out.println("Error reading Logo");
        }

        preferences = check_preferences();
        if (!preferences) {
            myUtils.checkExifTool(mainScreen.this.rootPanel);
        }

        programButtonListeners();
    }
    // main method in my main class for my project
    public static void main(String[] args) {

        JFrame frame = new JFrame("jExifToolGUI");
        frame.setContentPane(new mainScreen(frame).rootPanel);
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}

从主类调用的JDialog类/方法

package org.hvdw.jexiftoolgui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class prefJDialog extends JDialog {
    private JButton okButton;
    private JButton cancelButton;

    private JPanel prefsPanel;

    private boolean okPressed;

    public prefJDialog(JPanel prefsPanel) {
        super(JOptionPane.getFrameForComponent(prefsPanel), true);
        this.prefsPanel = prefsPanel;
        setTitle("Preferences");
        initDialog();
    }

    public void showDialog() {
        setSize(800, 768);
        double x = getParent().getBounds().getCenterX();
        double y = getParent().getBounds().getCenterY();
        setLocation((int) x - getWidth() / 2, (int) y - getHeight() / 2);
        setVisible(true);
    }


    private void initDialog() {
        JPanel pane = new JPanel();
        pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
        pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10));
        add(pane);

        pane.add(Box.createVerticalGlue());
        FlowLayout l = new FlowLayout(FlowLayout.RIGHT);
        JPanel buttonsPane = new JPanel(l);
        okButton = new JButton("Save"); //$NON-NLS-1$
        buttonsPane.add(okButton);
        pane.getRootPane().setDefaultButton(okButton);
        cancelButton = new JButton("CANCEL"); //$NON-NLS-1$
        buttonsPane.add(cancelButton);

        buttonsPane.setMaximumSize(new Dimension(Short.MAX_VALUE, (int) l.preferredLayoutSize(buttonsPane).getHeight()));
        pane.add(buttonsPane);

        addListeners();
    }

    private void addListeners() {
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //saveProperties();
                setVisible(false);
                okPressed = true;
                //close();


                // dispose();
            }

        });
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
                //dispose();
                //close();
                okPressed = false;
            }
        });

    }

    public boolean isOkPressed() {
        return okPressed;
    }

    /*public void close() {
        WindowEvent winClosingEvent = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(winClosingEvent);
    }*/
}

那么,如何防止在JDialog中单击OK或Cancel时,整个应用程序关闭。它需要保持打开状态,直到用户单击右上角的“窗口关闭”X,或从“文件”菜单中单击-

我在谷歌搜索了好几天,但都找不到解决方案(同样的问题也没有答案)。

编辑:在帕特里克回答之后,我将close方法改为

    public void close() {
        this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    }

并删除了/*和*/。我还激活了close();在听众中再次出现,但这没有什么区别。我的主应用程序仍然关闭。

共有1个答案

怀飞扬
2023-03-14
     switch(ev.getActionCommand()) {
            case "Preferences":
                showPreferencesDialog();
            case "Exit":
                System.exit(0);
                break;

问题是,你的开关盒中没有break语句,所以代码会进入“退出”逻辑,并执行系统。退出(0)

这就是为什么我们需要一个适当的“MCVE”来回答每个问题。当你发布随机的代码片段时,我们看不到整个逻辑流程

 类似资料:
  • 对于JavaFX,通常是: 是否有方法检测TornadoFX视图关闭?

  • 我正在Java做一个应用程序,我需要它在后台工作,当用户关闭应用程序时,他仍然保持隐藏状态

  • 问题内容: 我的Spring Boot应用程序不是Web服务器,而是使用自定义协议的服务器(在这种情况下使用Camel)。 但是Spring Boot在启动后立即(优美地)停止。我该如何预防? 我希望该应用程序按Ctrl + C或以编程方式停止。 问题答案: 从Apache Camel 2.17开始,有一个更干净的答案。引用http://camel.apache.org/spring- boot.

  • 我有一个Spring启动应用程序。 我已经在我的bean中实现了接口,它在它的方法中启动异步snmp服务器,并在它的方法中停止它。 除了主应用程序上下文在启动后立即停止,所以我的服务器bean也在启动后立即停止之外,所有这些都可以正常工作。 我只需要让spring上下文仅在启动shutdown hook时停止。 这不是一个web应用程序,所以我不需要,它通过启动webserver来解决这个问题,w

  • 我的Spring Boot应用程序不是Web服务器,但它是使用自定义协议的服务器(在本例中使用Camel)。 但是Spring Boot在启动后立即(优雅地)停止。我如何防止这种情况? 我希望应用程序停止,如果Ctrl C或编程。

  • 我有一个Jframe(美因茨), 它有一个按钮(showDialog), 当用户单击该按钮时, jdialog (Dialogz) 将显示, 那个jdialog有一个按钮 如何从该按钮关闭jdialog(在jdialog内部)? 我可以在创建对话框的实例后更改对话框的模式吗? 我需要阻止jdialog的所有者 我试着。。。 非常感谢你的任何帮助