我有一个带有actionlistener的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在屏幕上打开,有更多选项。它工作正常(到目前为止),但我想知道这个标准吗?我的意思是调用这样的主要方法? 另一个问题是,不使用cardlayout(我不想使用),是处理多个面板的最好方法,做这种事情?
答案 0 :(得分:7)
我会改变一些事情。首先,通常一个应用程序有一个JFrame然后如果它需要显示另一个窗口那么作为模态或非模态对话框,例如可以使用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;
}
}
答案 1 :(得分:2)
我宁愿创建一个JFrame或子类的新实例,也不想调用一个新的JFrame方法:
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == rejectionbutton){
JFrame frame = new JFrame("New Frame");
//or
makeNewFrame();
}
}
另一个简单的布局管理器是BorderLayout,它是JFrame类的默认布局管理器。
答案 2 :(得分:1)
new YourJFrameNameHere().setVisible(true);
将YourJFrameNameHere替换为JFrame名称。
简单,不是吗?