Java 一个框架打开另一个框架

Java 一个框架打开另一个框架,java,swing,awt,jframe,main,Java,Swing,Awt,Jframe,Main,我有一个JFrame和JPanel,里面有一个actionlistener,里面有很多Jsomethings。当用户单击一个对象时,我想打开另一个JFrame。以下是我所做的: public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == rejectionbutton){ RejectApp ra = new RejectApp();

我有一个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,然后如果它需要显示另一个窗口,则会显示一个模态或非模态对话框,例如可以通过JDialog或JOptionPane获得的对话框。话虽如此,在JFrame中使用一个JFrame并交换“视图”更为常见——通过CardLayout交换内容窗格或其他大型面板,因为这将模拟我们当前使用的许多gui程序的行为

就我个人而言,我还尝试将我的GUI创建转向创建JPanel或JComponent,而不是创建顶级窗口。这样,如果我想将GUI显示为独立的应用程序、对话框或小程序,我可以将其分别弹出到JFrame、JDialog或JApplet的contentPane中,或者作为更复杂GUI的内部面板,然后将其插入其中,或者插入具有交换视图的应用程序中,然后作为CardLayout中的卡,如上所述。底线是,我觉得这种结构为开发人员提供了更多的选择,让他们知道如何使用这个GUI

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

对于你的第二个问题,它引出了我自己的一个问题:为什么你不想使用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);
用JFrame名称替换此处的JFrameName


简单,否?

不要忘记调用frame.setVisible(true);此外,可能需要保留对开放框架的引用。如果需要重新打开同一帧,这可能很有用。但是,这需要正确处理缓存的JFrame引用(即在需要时处理它们等)。-1这听起来根本不对。。。任何支持“通常一个应用程序有一个JFrame,然后如果它需要显示另一个窗口作为模态或非模态对话框(如可以使用JDialog或JOptionPane获得的对话框)”语句的引用?对于我使用的大多数应用程序来说,这似乎都是正确的。例如,当您使用Microsoft Word时,通常会看到多少个主窗口?如果用户需要更改某种属性,然后单击菜单更改属性,然后弹出一个窗口,通常90%以上的时间会看到什么类型的窗口?根据我的经验,这也是一个对话。此外,如果用户关闭对话框,是否存在关闭整个应用程序的风险?你能对JFrame说同样的话吗?+1气垫船的建议是以“健康”的方式观看JFrame。只有一个顶级容器是有意义的。@气垫船上满是鳗鱼,可能有一个主应用程序框架的概念,它处理其他框架的创建/处理,当用户决定关闭主框架时,它应该做出相应的反应(即,检查是否可以安全关闭所有生成的帧,如果可能发生数据丢失,则拒绝关闭应用程序等)。企业桌面应用程序有多个非对话框窗口,web应用程序有多个窗口(任何链接都可以在单独的浏览器选项卡或窗口中打开)“气垫船”充满了鳗鱼形态,只有在有意义的时候才可以使用——而不是作为“其他窗口”的一种方式。你可能想考虑MixDead(),一旦你了解它,它就是一个优秀的布局管理器。你从来没有告诉我们你为什么想要避免卡纸布局。