一个JFrame打开另一个

我有一个JFrame和JPanel, 其中包含一个带有actionlistener的Jsomethings 。 当用户单击一个对象时,我想打开另一个JFrame。 这是我做的:

public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == rejectionbutton){ RejectApp ra = new RejectApp(); ra.main(null); } } 

(RejectApp调用一个新的JFrame。)因此,另一个JFrame在屏幕上打开,有更多选项。 它工作正常(到目前为止),但我想知道这个标准吗? 我的意思是调用这样的主要方法? 另一个问题是,不使用cardlayout(我不想使用),是处理多个面板的最好方法,做这种事情?

我会改变一些事情。 首先,通常一个应用程序有一个JFrame,然后如果它需要显示另一个窗口,那么就像一个模态或非modal dialog,例如可以用JDialog或JOptionPane获得。 话虽如此,在JFrame中使用一个JFrame和交换“视图”更为常见 – 通过CardLayout交换contentPanes或其他大型面板,因为这会模仿我们目前使用的许多gui程序的行为。

就个人而言,我也尝试将GUI创建用于创建JPanel或JComponent而不是创建顶级窗口。 这样,如果我想将GUI显示为独立应用程序,对话框或applet,我可以将它分别弹出到JFrame或JDialog或JApplet的contentPane中,或者如果作为更复杂GUI的内部面板,则将其插入那里,或在具有交换视图的应用程序中插入,然后作为CardLayout中的卡片,如上所述。 最重要的是,我认为这种结构为开发人员提供了更多关于如何使用此GUI的选项。

另外,我会避免在你正在做的时候调用另一个类的main(假设这是public static void main方法),因为你失去了OOP的所有好处。 您似乎也试图以非静态方式调用静态方法(假设我正确理解您的程序结构)。

对于你的第二个问题,它引出了一个我自己的问题:为什么你不想使用CardLayout?

编辑:我的意思的一个例子如下:

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

我宁愿创建一个JFrame或子类的新实例,或者调用一个新方法来创建一个新的JFrame:

 public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == rejectionbutton){ JFrame frame = new JFrame("New Frame"); //or makeNewFrame(); } 

}

另一个简单的布局管理器是BorderLayout,它是JFrame类的默认布局管理器。

 new YourJFrameNameHere().setVisible(true); 

将YourJFrameNameHere替换为JFrame名称。

简单,不是吗?