JDialog and its owner

I am trying to use multiple JDialogs inside my JPanel form to notify the user about invalid data and form submission.

I'm just a little confused about the JDialog constructor. I'd like to bind the dialog to the panel (just because that's where it was created), but obviously the only owner options that are allowed are top-level frames (which I don't think I can access from the JPanel). or Dialogue (which I don't see to help me).

I could pass the frame link down to the JPanel, but is that a bit of a weird design? Or am I misunderstanding the class, or just more broadly, where should the JDialog be instantiated?

Hopefully I've made it clear what sscce can do if it helps. Thank.

+3


source to share


3 answers


the only owner options that are allowed are top level frames (which I don't think I can access from the JPanel

You can access the parent frame of the panel using:



Window window = SwingUtilities.windowForComponent( yourPanelHere );

      

Then just use the window as the owner of the dialog.

+2


source


JComponent.getTopLevelAncestor gives you the owner of the JPanel:



Returns the top-level ancestor of this component (either containing a window or applet), or null if this component has not been added to any container.

+2


source


You may try:

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

      

0


source







All Articles