从JButton问题

时间:2018-03-09 00:04:49

标签: java user-interface jframe jbutton actionlistener

只是一个免责声明:我已经检查了大部分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;
&#13;
&#13;

提前致谢!我希望你们中的一些人可以找到一种方法来修复我的代码:(

此致

2 个答案:

答案 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();隐藏起始屏幕。