gpt4 book ai didi

java - 一个 JFrame 打开另一个

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:50:51 26 4
gpt4 key购买 nike

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

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

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

}

}

(RejectApp 调用一个新的 JFrame。)因此屏幕上会打开另一个 JFrame,其中包含更多选项。它工作正常(到目前为止),但我想知道这是标准吗?我的意思是像这样调用主要方法?另一个问题是,不使用卡片布局(我不想使用)是处理多个面板的最佳方式吗?

最佳答案

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

就我个人而言,我还尝试将我的 GUI 创建用于创建 JPanel 或 JComponent,而不是用于创建顶级窗口。这样,如果我想将 GUI 显示为独立应用程序、对话框或小程序,我可以分别将其弹出到 JFrame 或 JDialog 或 JApplet 的 contentPane 中,或者如果作为更复杂 GUI 的内部面板,则将它插入到那里,或者插入到具有交换 View 的应用程序中,然后作为卡片插入到 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;
}
}

关于java - 一个 JFrame 打开另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com