我有一个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(我不想使用),通过这种事情处理多个面板的最佳方法是吗?
我会改变一些事情。首先,通常应用程序具有一个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;
}
}
EDIT2:测试过了。这无疑是新JPanel的一个问题。 解决方案:正如建议的那样,答案是我忘了明确地将我的JPanel设置到JFrame上。改变: 到 这对我很管用! 我的问题是JFrame的一个奇怪行为。 在我的代码中,我的主机上有一个单选按钮。按下时,会打开另一个框架。 在我的新框架里,我做了一个JPanel。在添加JPanel之前,另一个框架没有冻结,所以我相信问题与新的JPanel有关。
我有3个不同的JFrames。一个是一个登录页面,另一个有,第三个是主页。现在我想要的是,当我们登录时,我想在登录页面上方显示,并在完成进度到100%时,我想关闭两个框架并打开第三个,这是主页。请好心帮我完成这项工作。谢谢//这是代码部分。 }//这打开我的进度条的第二个JFrame //在Progressbar页面的下一页,我有这个代码 //现在我想要的是,在进度条完成后,我想处理登录页面和只打
问题内容: 我有一个主JFrame,其中具有用于不同功能的各种面板,人们可以在其中进行计算。我想在用户单击第一个计算按钮时打开一个新的JFrame并用作“输出”窗口(如果您熟悉它们,则类似于SPSS输出窗口)。 New JFrame将是完全独立的,并且将具有其自己的菜单栏。简单的JDialog并不是解决之道。 问题答案: 无法抗拒,简单地不同意答案); 和 我想在用户单击第一个计算按钮时打开一个新
问题内容: 我有一JFrame堂课,它是在Netbeans的设计部分制作的。我正在尝试创建一个登录按钮,该按钮将关闭当前框架并打开另一个框架,无论如何我可以这样做吗? 我努力了: 但我希望它在设计部分中可编辑! 问题答案: 双击NETBEANS中的“登录”按钮,或在Click事件上添加事件监听器(ActionListener)
问题内容: 我下棋。我写了3节课。如果是游戏则为第一。(棋盘,棋子等),另外一个用于菜单。(新,打开,设置时间等按钮) 他们两个都使用JFrame。 我想将上述两个类都放在第3类中。例如,“游戏”窗口在左侧,菜单在右侧。第三类还将通过JFrame显示整个应用程序。 怎么做? 问题答案: 您不能将一个JFrame放入另一个。您在这里有几个设计选择。您可以将JFrames更改为JPanels。这可能是
我是Java独立应用程序开发新手。在我的代码中,我使用下面的代码示例从一个jFrame移动到另一个jFrame。 在当前的jFrame主页中使用了一些变量,比如用户名。当我使用相同的代码返回主页时,该jFrame中没有该值(用户名),因为它们是从另一个jFrame(登录jFrame)传递的。 所以我想显示包含这些数据的主页(我之前隐藏的那一个)。谁能帮我一下吗。 附言:我熟悉视觉工作室独立应用程序