只是一个免责声明:我已经检查了大部分Stack Overflow并且无法在网站上找到答案。我还问过一些关于Reddit的好人,但只是在中途修好了。
所以,我正在尝试创建一个GUI应用程序,我是Java语言的新手(非常非常新 - 所以我很有可能犯了一个菜鸟错误)。我已经为我的' StartScreen'设计了界面。我想让button1打开我的第二堂课(' NewUsers')。
我正在使用GUI编辑器,我认为这可能是导致我出现问题的原因,作为我在线问题的答案,我看到人们添加了
this.dispose();
new JFrame().setVisible(true);
然而,这并不适用于我。我设法将其修复到某一点,现在我可以在点击时关闭框架,但我仍然无法弄清楚如何从按钮打开另一个框架:(。这是我的Frame1代码( ' StartScreen')。Frame2现在只是一个空窗口,但它用于测试目的。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class StartScreen {
private final JFrame frame;
private JButton newUserButton;
private JButton existingUserButton;
private JButton nonUserBookingButton;
private JPanel panell;
public StartScreen() {
this.frame = new JFrame("StartScreen");
frame.setContentPane(panell);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
newUserButton.addActionListener(this::onNewUserClicked);
}
public static void newuserscall
() {
NewUsers newuserscall = new NewUsers();
}
private void onNewUserClicked(ActionEvent event) {
frame.setVisible(false);
}
public static void main(String[] args) {
new StartScreen();
}
{
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
$$$setupUI$$$();
}
/**
* Method generated by IntelliJ IDEA GUI Designer
* >>> IMPORTANT!! <<<
* DO NOT edit this method OR call it in your code!
*
* @noinspection ALL
*/
private void $$$setupUI$$$() {
panell = new JPanel();
panell.setLayout(new GridBagLayout());
panell.setPreferredSize(new Dimension(600, 400));
final JPanel spacer1 = new JPanel();
GridBagConstraints gbc;
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 4;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(30, 0, 0, 0);
panell.add(spacer1, gbc);
newUserButton = new JButton();
newUserButton.setText("Button");
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
panell.add(newUserButton, gbc);
existingUserButton = new JButton();
existingUserButton.setText("Button");
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 4;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
panell.add(existingUserButton, gbc);
nonUserBookingButton = new JButton();
nonUserBookingButton.setText("Button");
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 6;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
panell.add(nonUserBookingButton, gbc);
final JPanel spacer2 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.VERTICAL;
panell.add(spacer2, gbc);
final JPanel spacer3 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 5;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(0, 250, 0, 0);
panell.add(spacer3, gbc);
final JPanel spacer4 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 5;
gbc.fill = GridBagConstraints.VERTICAL;
panell.add(spacer4, gbc);
final JPanel spacer5 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(25, 0, 0, 0);
panell.add(spacer5, gbc);
final JLabel label1 = new JLabel();
label1.setText("Label");
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
panell.add(label1, gbc);
final JPanel spacer6 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 6;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(30, 0, 0, 0);
panell.add(spacer6, gbc);
final JPanel spacer7 = new JPanel();
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.insets = new Insets(30, 0, 0, 0);
panell.add(spacer7, gbc);
}
/**
* @noinspection ALL
*/
public JComponent $$$getRootComponent$$$() {
return panell;
}
}
&#13;
提前致谢!我希望你们中的一些人可以找到一种方法来修复我的代码:(
此致
答案 0 :(得分:0)
我开始说的是你是对的:永远不要使用GUI Builder。我甚至不想在你试图学习的时候,我的意思是从不使用它。它主要用于对概念进行原型设计,并不代表您将其用于学习或生产代码。下面是一个清理过的更精确的示例,但在您的特定示例中,您需要添加
new JFrame().setVisible(true);
在onNewUserClicked
函数内部。此外,请注意,当您这样做时,您将创建一个空框架,这将是您的操作系统创建它所需的绝对最小尺寸,因为其中没有任何内容,您从未打包过框架,并且从不手动和明确地设置尺寸,因此请检查显示器的左上区域 - 它在那里。
这可能更接近你想要的清洁度。
public class Foo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame jf = new JFrame();
JPanel jp = new JPanel();
JButton jb = new JButton("New Frame");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jf.setVisible(false);
new JFrame().setVisible(true);
}
});
jp.setLayout(new FlowLayout());
jp.add(jb);
jf.setContentPane(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
jf.pack();
}
}
}
}
我说清洁的原因是因为LayoutManager的控制。像你使用的GUI构建器总是倾向于使用GridBagLayout,因为它更容易动态地(从你的用户输入)精确地放置东西。但它生成的代码是无法管理的。当您考虑扩展或收缩GUI时,事情变得更糟,GridBagLayout对此不灵活,所以现在您的组件在从GUI Builder中拖动它们时正好卡在您放置它们的位置。正确使用正确的LayoutManager将为您提供灵活且可管理的GUI。查看此Oracle指南以获取更多信息和帮助:https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
答案 1 :(得分:-1)
这是因为您在显示父框架之前处置父框架。
在这种情况下,您从中调用的父框架
new JavaFrame2().SetVisibility(true);
包含新JavaFrame的句柄。通过处理父框架,您在技术上删除了父框架 - &gt;你不能再用它做点什么了。
尝试通过调用.SetVisibility(false)
而不是this.dispose();
隐藏起始屏幕。