小编典典

一个JFrame打开另一个

java

我有一个JFrame和JPanel, 里面装满了 带有 动作监听器的Jsomethings
。当用户单击一个对象时,我想打开另一个JFrame。这是我所做的:

public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();

    if (source == rejectionbutton){
        RejectApp ra = new RejectApp();
        ra.main(null);

    }

}

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


阅读 219

收藏
2020-11-23

共1个答案

小编典典

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

就个人而言,我还尝试将GUI创建用于创建JPanel或JComponent,而不是创建顶层窗口。这样,如果我想将GUI显示为独立的应用程序,对话框或小程序,可以将其分别弹出到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;
    }
}
2020-11-23