单击 JButton 时退出 JFrame



我正在编写一个登录 GUI,并希望取消按钮在单击时关闭整个程序。我是计算机科学专业的大一新生,对Java和编程还是半新手。这是我的代码:

主类:

public class loginGui
{
    public static void main(String[] args)
    {
        lGui gui = new lGui();
        lGui.gui();
    }
}

图形用户界面类:

public class lGui
{
    public static void gui()
    {
        JFrame frame;
        JTextField field;
        JLabel l;
        JPasswordField p;
        JButton login, cancel;
        JCheckBox check;
        frame = new JFrame("Login");
        frame.setSize(300, 150);
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.setLocation(300, 200);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        l = new JLabel("Username: ");
        l.setLocation(15, 14);
        l.setSize(l.getPreferredSize());
        frame.add(l);
        field = new JTextField("Username");
        field.setColumns(15);
        field.setSize(field.getPreferredSize());
        field.setBackground(Color.DARK_GRAY);
        field.setForeground(Color.LIGHT_GRAY);
        field.setLocation(90, 10);
        field.setToolTipText("Enter User Name");
        frame.add(field);
        l = new JLabel("Password: ");
        l.setLocation(15, 54);
        l.setSize(l.getPreferredSize());
        frame.add(l);
        p = new JPasswordField("Password");
        p.setColumns(15);
        p.setSize(p.getPreferredSize());
        p.setBackground(Color.DARK_GRAY);
        p.setForeground(Color.LIGHT_GRAY);
        p.setLocation(90, 50);
        p.setToolTipText("Enter Password");
        frame.add(p);
        login = new JButton("Login");
        login.setSize(login.getPreferredSize());
        login.setLocation(195, 78);
        login.setToolTipText("Login");
        frame.add(login);
        login.addActionListener(new loginAction());
        cancel = new JButton("Cancel");
        cancel.setSize(cancel.getPreferredSize());
        cancel.setLocation(95, 78);
        cancel.setToolTipText("Cancel");
        frame.add(cancel);
        cancel.addActionListener(new cancelAction());
        check = new JCheckBox("Remember me?");
        check.setSize(check.getPreferredSize());
        check.setLocation(120, 100);
        check.setToolTipText("Remember your username for next time");
        frame.add(check);
        frame.setVisible(true);
    }
    static class cancelAction implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            frame.dispose();            
        }
    }
    static class loginAction implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
        }
    }
}

我在取消按钮ActionListener中不断收到"找不到符号"错误:

frame.dispose();

frame 只有 static 方法gui中的上下文。首先摆脱static声明,并frame类的实例字段

public class lGui
{
    private JFrame frame;
    private JTextField field;
    private JLabel l;
    private JPasswordField p;
    private JButton login, cancel;
    private JCheckBox check;
    public void gui()
    {
        //...

您也不需要内部类上的static声明...

protected class cancelAction implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        frame.dispose();            
    }
}
protected class loginAction implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
    }
}

您可能会发现从类构造函数而不是gui方法中初始化 UI 更容易,让它显示窗口

您还应该避免使用null布局,像素完美布局是现代 UI 设计中的错觉。 影响组件单个尺寸的因素太多了,您都无法控制这些因素。Swing旨在以布局管理器为核心,丢弃这些将导致无休止的问题和问题,您将花费越来越多的时间试图纠正

相反,请查看在容器中布置组件以获取更多想法

方法gui中的代码必须位于构造函数中,并且JFrame对象必须在任何方法之外定义为类:)的字段

最新更新