以编程方式关闭JDialog中显示的JPanel

gti*_*333 1 java swing

我有一个主应用程序框架(MainFrame class).在a的actionperformed事件中JButton,a JPanel (MyJPanel class)通过放入来打开JDialog.我没有扩展JDialog到创建MyJPanel类,因为我也可能在其他目的上需要MyJPanel.

我的问题是我无法以编程方式关闭MyJPanel显示的内容JDialog.有什么我想念的吗?你能搞清楚吗?

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

    }
Run Code Online (Sandbox Code Playgroud)

MyJPanel课程:

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;

    }

}
Run Code Online (Sandbox Code Playgroud)

更新 我使用霍华德的答案解决了这个问题:

...     
if (isShownInJDialog) {
        Window w = SwingUtilities.getWindowAncestor(MyJPanel.this);
        w.setVisible(false);
}
...
Run Code Online (Sandbox Code Playgroud)

How*_*ard 7

如果我正确理解你的问题,你想要关闭JDialogMyJPanel所包含的内容但没有引用它?

您可以使用构造函数提供此类引用,MyJPanel也可以更改ActionListenerto中的代码

Window w = SwingUtilities.getWindowAncestor(MyJPanel.this);
w.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

它会在没有直接引用的情况下查找面板的父窗口.