Как предотвратить закрытие JDialog всего приложения - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть главное (экранное) окно графического интерфейса, и мне нужно открыть несколько окон с несколькими входами (jdialog или, когда невозможно, jframe), например, чтобы добавить настройки (4 текстовых поля с 2 файловыми переключателями и 2 радиокнопками). При нажатии OK / Отмена в этих JDialogs (или JFrames), все мое приложение закрывается. Я не хочу этого Как я могу предотвратить это?

Первая попытка : я попробовал опцию intelliJ «Создать -> Создать класс диалога», которая дает мне JDialog с кнопкой OK / Cancel. Нажатие одной из кнопок закрывает JDialog и все мое приложение.

Вторая попытка : я написал класс "от руки", который создает JDialog (а также пробовал JFrame). Снова: нажатие одной из кнопок закрывает JDialog и все мое приложение.

Я удалил опции «dispose ()» и «setVisible (false)» из JDialog (JFrame), но все мое приложение закрыто.

метод основного класса

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);
    }*/
}

Так как мне предотвратить, чтобы при нажатии OK или Отмена в JDialog все приложение закрывалось. Это должно оставаться открытым, пока пользователь не нажмет «закрыть окно» X в правом верхнем углу или из меню «Файл -> Выход»

Я искал в Google несколько дней, но не могу найти решение (и один и тот же вопрос без ответа).

Edit: После ответа Патрика я изменил метод закрытия на

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

И убрал / * и * /. Я также активировал закрытие (); снова в слушателях, но это не имеет значения. Мое главное приложение все еще закрыто.

1 Ответ

1 голос
/ 29 апреля 2019
     switch(ev.getActionCommand()) {
            case "Preferences":
                showPreferencesDialog();
            case "Exit":
                System.exit(0);
                break;

И проблема в том, что у вас нет оператора break в вашем случае коммутатора, поэтому код переходит к логике "Выход" и выполняет System.exit(0)

Этопочему нам нужен правильный "MCVE" с каждым вопросом.Когда вы публикуете случайные фрагменты кода, мы не можем видеть весь логический поток.

...