Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I would change a few things. First off, usually an application has one JFrame and then if it needs to show another window does so as a modal or non-modal dialog such as can be obtained with a JDialog or JOptionPane. Having said that, it's even more common to have one JFrame and swap "views" in the JFrame -- swap contentPanes or other large panels via a CardLayout as this would mimic the behavior of many gui programs we all currently use. </p> <p>Personally, I also try to gear my GUI creation towards creating a JPanel or JComponent rather than towards creating a top-level window. This way if I want to display the GUI as a stand alone app, a dialog, or an applet I can pop it into the contentPane of a JFrame or JDialog or JApplet respectively, or if as an inner panel of a more complex GUI, then insert it there, or in an application with a swapping view, then as a card in a CardLayout as noted above. The bottom line is I feel that this structure gives you the developer a lot more options in how you can use this GUI.</p> <p>Also, I would avoid calling another class's main as you're doing (assuming this is the public static void main method) as you lose all benefits of OOPs. You also seem to be trying to call a static method in a non-static way (assuming I understand your program structure correctly).</p> <p>For your second question, it begs a question of my own: why do you not want to use CardLayout?</p> <p>edit: an example of what I meant is as follows:</p> <pre><code>import java.awt.Dimension; import java.awt.Window; import java.awt.Dialog.ModalityType; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class SwingEg { private static void createAndShowUI() { JFrame frame = new JFrame("Main JFrame"); frame.getContentPane().add(new MainGUI().getMainPanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } class MainGUI { private static final Dimension MAIN_PANEL_SIZE = new Dimension(450, 300); private JPanel mainPanel = new JPanel(); private JDialog modalDialog; private JDialog nonModalDialog; public MainGUI() { JButton openModalDialogBtn = new JButton("Open Modal Dialog Window"); openModalDialogBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openModalDialogBtnActionPerformed(e); } }); JButton openNonModalDialogBtn = new JButton("Open Non-Modal Dialog Window"); openNonModalDialogBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openNonModalDialogBtnActionPerformed(e); } }); mainPanel.setPreferredSize(MAIN_PANEL_SIZE); mainPanel.add(openModalDialogBtn); mainPanel.add(openNonModalDialogBtn); } private void openModalDialogBtnActionPerformed(ActionEvent e) { if (modalDialog == null) { Window topWindow = SwingUtilities.getWindowAncestor(mainPanel); modalDialog = new JDialog(topWindow, "Modal Dialog", ModalityType.APPLICATION_MODAL); modalDialog.getContentPane().add(new DialogPanel().getMainPanel()); modalDialog.pack(); modalDialog.setLocationRelativeTo(topWindow); modalDialog.setVisible(true); } else { modalDialog.setVisible(true); } } private void openNonModalDialogBtnActionPerformed(ActionEvent e) { if (nonModalDialog == null) { Window topWindow = SwingUtilities.getWindowAncestor(mainPanel); nonModalDialog = new JDialog(topWindow, "Non-Modal Dialog", ModalityType.MODELESS); nonModalDialog.getContentPane().add(new DialogPanel().getMainPanel()); nonModalDialog.pack(); nonModalDialog.setLocationRelativeTo(topWindow); nonModalDialog.setVisible(true); } else { nonModalDialog.setVisible(true); } } public JPanel getMainPanel() { return mainPanel; } } class DialogPanel { private static final Dimension DIALOG_SIZE = new Dimension(300, 200); private JPanel dialogPanel = new JPanel(); public DialogPanel() { dialogPanel.add(new JLabel("Hello from a dialog", SwingConstants.CENTER)); dialogPanel.setPreferredSize(DIALOG_SIZE); } public JPanel getMainPanel() { return dialogPanel; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload