单击 JButton 时退出 JFrame
Exiting JFrame when JButton is clicked
我正在编写一个登录 GUI,希望取消按钮在单击时关闭整个程序。我是一名计算机科学专业的大一新生,对 java 和一般编程仍然是半新的。这是我的代码:
主要Class:
public class loginGui
{
public static void main(String[] args)
{
lGui gui = new lGui();
lGui.gui();
}
}
图形界面 class:
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 中收到 "cannot find symbol" 错误:
frame.dispose();
frame
只有来自您的 static
方法 gui
的上下文。首先摆脱 static
声明,并使 frame
成为 class
的实例字段
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
内部声明 classes...
protected class cancelAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
frame.dispose();
}
}
protected class loginAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
您可能会发现从 classes 构造函数而不是 gui
方法中初始化 UI 更容易,让它显示 window
您还应避免使用 null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
相反,请查看 Laying Out Components Within a Container 以获得更多想法
gui
方法中的代码必须在构造函数中,并且您的 JFrame
对象必须在任何方法之外定义,作为 class 的字段:)
我正在编写一个登录 GUI,希望取消按钮在单击时关闭整个程序。我是一名计算机科学专业的大一新生,对 java 和一般编程仍然是半新的。这是我的代码:
主要Class:
public class loginGui
{
public static void main(String[] args)
{
lGui gui = new lGui();
lGui.gui();
}
}
图形界面 class:
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 中收到 "cannot find symbol" 错误:
frame.dispose();
frame
只有来自您的 static
方法 gui
的上下文。首先摆脱 static
声明,并使 frame
成为 class
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
内部声明 classes...
protected class cancelAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
frame.dispose();
}
}
protected class loginAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
您可能会发现从 classes 构造函数而不是 gui
方法中初始化 UI 更容易,让它显示 window
您还应避免使用 null
布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件个体大小的因素太多,none 是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
相反,请查看 Laying Out Components Within a Container 以获得更多想法
gui
方法中的代码必须在构造函数中,并且您的 JFrame
对象必须在任何方法之外定义,作为 class 的字段:)