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

时间:2012-06-07 16:52:38

标签: java swing

我有一个主应用程序框架(MainFrame class)。在JButton的已执行操作事件中,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); } } 。有什么我想念的吗?你能搞清楚吗?

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;

    }

}

MyJPanel课程:

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

更新 我能够用Howard的答案解决这个问题:

{{1}}

1 个答案:

答案 0 :(得分:7)

如果我正确理解了您的问题,您想关闭JDialog所包含的MyJPanel,但没有引用它?

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

Window w = SwingUtilities.getWindowAncestor(MyJPanel.this);
w.setVisible(false);

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