2 Stimmen

programmatisch ein JPanel schließen, das in JDialog angezeigt wird

Ich habe einen Hauptanwendungsrahmen ( MainFrame class ). Beim Ereignis actionperformed eines JButton , a JPanel (MyJPanel class) wird geöffnet, indem es in JDialog . Ich werde nicht verlängern JDialog zu erstellen MyJPanel Klasse, weil ich MyJPanel auch für andere Zwecke brauchen könnte.

Mein Problem ist, dass ich das Programm nicht schließen kann. MyJPanel die angezeigt wird in JDialog . Gibt es etwas, das ich übersehen habe? Könnten Sie das bitte herausfinden?

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

    public class MainFrame extends JPanel {
        public MainFrame() {

            JButton btnOpenJdialog = new JButton("Open JDialog");
            add(btnOpenJdialog);
            btnOpenJdialog.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    JDialog jd = new JDialog();
                    MyJPanel mjp = new MyJPanel(true);//showing in JDialog
                    jd.setTitle("JDialog");
                    jd.add(mjp);
                    jd.pack();
                    jd.setVisible(true);

                }
            });
        }

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {

                public void run() {
                    createAndShowGUI();
                }
            });
        }

        public static void createAndShowGUI() {

            JFrame frame = new JFrame("Test-JFrame");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.getContentPane().add(new MainFrame());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

    }

MyJPanel-Klasse :

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.JButton;

public class MyJPanel extends JPanel {
    private boolean isShownInJDialog = false;

    public MyJPanel() {
        JButton btnCloseMe = new JButton("Finish Action");
        add(btnCloseMe);
        btnCloseMe.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (isShownInJDialog) {
                    MyJPanel.this.setVisible(false);
                    //how to close the JDialog too.
                }
                else {
                    //just hide the content, 
                    MyJPanel.this.setVisible(false);
                }
            }
        });
    }

    public MyJPanel(boolean isShownInJDialog) {
        this();
        this.isShownInJDialog = isShownInJDialog;

    }

}

UPDATE Ich konnte dieses Problem mit Hilfe von Howards Antwort wie folgt lösen:

...     
if (isShownInJDialog) {
        Window w = SwingUtilities.getWindowAncestor(MyJPanel.this);
        w.setVisible(false);
}
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X