JDialog及其所有者

时间:2017-05-15 16:42:01

标签: java swing

我试图在我的表单JPanel中使用一些JDialog来通知用户不正确的数据和表单提交。

我对JDialog构造函数感到有些困惑。我想将对话框链接到面板(只是因为它创建了它),但显然唯一允许的所有者参数是顶级框架(我不会这样做)。我认为我可以从JPanel访问,或者对话(我无法帮助我)。

我可以将Frame的参考传递给JPanel,但是这不是一个有点奇怪的设计吗?或者我是否误解了这个类,或者更常见的是应该实例化JDialog的地方?

希望我已经清楚明白,如果它有所帮助,我可以制作一个sscce。感谢。

3 个答案:

答案 0 :(得分:2)

JComponent.getTopLevelAncestor为您提供JPanel的所有者:

  

返回此组件的顶级祖先(或者   包含Window或Applet),如果没有此组件,则返回null   添加到任何容器中。

答案 1 :(得分:2)

  

唯一允许的所有者参数是顶级框架(我认为我不能从JPanel访问

您可以使用以下方法访问面板的父框架:

Window window = SwingUtilities.windowForComponent( yourPanelHere );

然后只需使用该窗口作为对话框的所有者。

答案 2 :(得分:0)

你可以尝试一下:

import java.awt.BorderLayout;
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.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class DialogTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                DialogFrame frame = new DialogFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }

}

/**
  * Frame contains menu. When we choose menu "File-> About" JDialog will be shown
 */
class DialogFrame extends JFrame {

    public DialogFrame() {
        setTitle("DialogTest");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        // Menu
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);

        // Add About & Exit.
        // Choose About - > About
        JMenuItem aboutItem = new JMenuItem("About");
        aboutItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                if (dialog == null) //if not
                {
                    dialog = new AboutDialog(DialogFrame.this);
                }
                dialog.setVisible(true); // to show dialog
            }
        });
        fileMenu.add(aboutItem);

        // When Exit 
        JMenuItem exitItem = new JMenuItem("Exit");
        exitItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        fileMenu.add(exitItem);
    }

    public static final int DEFAULT_WIDTH = 300;
    public static final int DEFAULT_HEIGHT = 200;

    private AboutDialog dialog;
}

/*
 * Modal dialog waits on click
 */
class AboutDialog extends JDialog {

    public AboutDialog(JFrame owner) {
        super(owner, "About DialogTest", true);

        // Mark with HTML centration
        add(new JLabel(
                "<html><h1><i>Все о Java</i></h1><hr>"
                + "Something about java and JDialog</html>"),
                BorderLayout.CENTER);

        // When push "ok" dialog window will be closed
        JButton ok = new JButton("ok");
        ok.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                setVisible(false);
            }
        });

        // Button ОК down of panel
        JPanel panel = new JPanel();
        panel.add(ok);
        add(panel, BorderLayout.SOUTH);
        setSize(260, 160);
    }
}