Java Swing - GUI 操作
Java Swing - manipulation of GUI
我可能遇到了一些微不足道的问题,但我花了几个小时寻找答案。
我想创建一个按钮(ENTER 按钮),单击该按钮会删除 GUI 上的某些组件(如小键盘)。问题是 class 定义了单击按钮后执行的指令,但看不到这些组件。我试图将 implements ATM
添加到此 class 但随后控制台返回了非常奇怪的错误(执行时)。有什么 'clean' 方法可以做到这一点吗?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ATM extends JFrame{
// Container
int state = 0; // PIN screen
// ELEMENTS
JPanel container = new JPanel();
JTextArea display = new JTextArea("Please enter your PIN", 10, 50);
JTextField inputArea = new JTextField("");
JPanel buttons = new JPanel();
JButton one = new JButton("1");
JButton two = new JButton("2");
JButton three = new JButton("3");
JButton four = new JButton("4");
JButton five = new JButton("5");
JButton six = new JButton("6");
JButton seven = new JButton("7");
JButton eight = new JButton("8");
JButton nine = new JButton("9");
JButton zero = new JButton("0");
JButton clear = new JButton("Clear");
JButton enter = new JButton("Enter");
JButton quit = new JButton("Quit");
// EVENTS
ButtonPresser buttonPress = new ButtonPresser(inputArea, display);
EnterPresser enterPress = new EnterPresser(inputArea, display, state, buttons);
ATM(){
super("ATM Cash Machine");
buildGUI();
pack();
setVisible(true);
}
private void buildGUI(){
// EVENT BINDINGS
one.addActionListener(buttonPress);
two.addActionListener(buttonPress);
three.addActionListener(buttonPress);
four.addActionListener(buttonPress);
five.addActionListener(buttonPress);
six.addActionListener(buttonPress);
seven.addActionListener(buttonPress);
eight.addActionListener(buttonPress);
nine.addActionListener(buttonPress);
zero.addActionListener(buttonPress);
clear.addActionListener(buttonPress);
quit.addActionListener(buttonPress);
enter.addActionListener(enterPress);
// ELEMENT SETTINGS
inputArea.setEditable(false);
display.setEditable(false);
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
container.add(display);
container.add(inputArea);
// Numeric pad
buttons.setLayout(new GridLayout(5,3));
buttons.add(one);
buttons.add(two);
buttons.add(three);
buttons.add(four);
buttons.add(five);
buttons.add(six);
buttons.add(seven);
buttons.add(eight);
buttons.add(nine);
buttons.add(clear);
buttons.add(zero);
buttons.add(enter);
buttons.add(quit);
container.add(buttons);
add(container, BorderLayout.NORTH);
}
// Main method
public static void main(String[] args){
ATM atm = new ATM();
}
}
class ButtonPresser implements ActionListener{
private JTextField iField;
private JTextArea oArea;
ButtonPresser(JTextField in, JTextArea out){
iField = in;
oArea = out;
}
public void actionPerformed(ActionEvent e){
switch(e.getActionCommand()){
case "Quit":
System.exit(0);
break;
case "Clear":
iField.setText("");
break;
default:
String fieldText = iField.getText();
if(fieldText.length() < 4){
iField.setText(fieldText+e.getActionCommand());
}
break;
}
}
}
class EnterPresser implements ActionListener{
private JTextField iField;
private JTextArea oArea;
private int state;
private JPanel buttons;
private final String PIN = "1234";
EnterPresser(JTextField in, JTextArea out, int st, JPanel but){
iField = in;
oArea = out;
state = st;
buttons = but;
}
public void actionPerformed(ActionEvent e){
if(state == 0){
String fieldText = iField.getText();
if(fieldText.equals(PIN)){
iField.setText("");
state = 1;
uiState0To1();
}
}
}
public void uiState0To1(){
buttons.remove(one);
}
}
我不确定您要删除哪些组件,但您的问题很清楚。 ATM class 中定义的所有组件都不是 public。从其他 classes 操作这些组件的一种方法是将它们设置为 public.
最简单的方法是将它们声明为"public static"并通过ATMclass静态引用它们。根据您的情况,您可能需要多个 ATM 实例,在这种情况下,您不会将它们声明为静态的。
这是另一个有很好信息的问题:Difference between public static and private static variables
解决您的问题很简单。您需要某种方式让您的 ButtonPresser
class 与您的 ATM
class 交谈,这是 Observer Pattern[= 的 classic 示例19=]
这个想法是,你会提供某种事件通知,你的 ButtonPresser
会在特定条件下触发,然后你的 ATM
class 会监听这些事件,它会然后根据这些事件决定它应该做什么。
ButtonPresser
不负责修改ATM
的状态,所以我们很清楚。
您现在正在进入 Model-View-Controller, which could provide you a means to utilise CardLayout
的领域,这将进一步降低问题的整体复杂性,但也会隔离责任并解耦您的代码
我可能遇到了一些微不足道的问题,但我花了几个小时寻找答案。
我想创建一个按钮(ENTER 按钮),单击该按钮会删除 GUI 上的某些组件(如小键盘)。问题是 class 定义了单击按钮后执行的指令,但看不到这些组件。我试图将 implements ATM
添加到此 class 但随后控制台返回了非常奇怪的错误(执行时)。有什么 'clean' 方法可以做到这一点吗?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ATM extends JFrame{
// Container
int state = 0; // PIN screen
// ELEMENTS
JPanel container = new JPanel();
JTextArea display = new JTextArea("Please enter your PIN", 10, 50);
JTextField inputArea = new JTextField("");
JPanel buttons = new JPanel();
JButton one = new JButton("1");
JButton two = new JButton("2");
JButton three = new JButton("3");
JButton four = new JButton("4");
JButton five = new JButton("5");
JButton six = new JButton("6");
JButton seven = new JButton("7");
JButton eight = new JButton("8");
JButton nine = new JButton("9");
JButton zero = new JButton("0");
JButton clear = new JButton("Clear");
JButton enter = new JButton("Enter");
JButton quit = new JButton("Quit");
// EVENTS
ButtonPresser buttonPress = new ButtonPresser(inputArea, display);
EnterPresser enterPress = new EnterPresser(inputArea, display, state, buttons);
ATM(){
super("ATM Cash Machine");
buildGUI();
pack();
setVisible(true);
}
private void buildGUI(){
// EVENT BINDINGS
one.addActionListener(buttonPress);
two.addActionListener(buttonPress);
three.addActionListener(buttonPress);
four.addActionListener(buttonPress);
five.addActionListener(buttonPress);
six.addActionListener(buttonPress);
seven.addActionListener(buttonPress);
eight.addActionListener(buttonPress);
nine.addActionListener(buttonPress);
zero.addActionListener(buttonPress);
clear.addActionListener(buttonPress);
quit.addActionListener(buttonPress);
enter.addActionListener(enterPress);
// ELEMENT SETTINGS
inputArea.setEditable(false);
display.setEditable(false);
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
container.add(display);
container.add(inputArea);
// Numeric pad
buttons.setLayout(new GridLayout(5,3));
buttons.add(one);
buttons.add(two);
buttons.add(three);
buttons.add(four);
buttons.add(five);
buttons.add(six);
buttons.add(seven);
buttons.add(eight);
buttons.add(nine);
buttons.add(clear);
buttons.add(zero);
buttons.add(enter);
buttons.add(quit);
container.add(buttons);
add(container, BorderLayout.NORTH);
}
// Main method
public static void main(String[] args){
ATM atm = new ATM();
}
}
class ButtonPresser implements ActionListener{
private JTextField iField;
private JTextArea oArea;
ButtonPresser(JTextField in, JTextArea out){
iField = in;
oArea = out;
}
public void actionPerformed(ActionEvent e){
switch(e.getActionCommand()){
case "Quit":
System.exit(0);
break;
case "Clear":
iField.setText("");
break;
default:
String fieldText = iField.getText();
if(fieldText.length() < 4){
iField.setText(fieldText+e.getActionCommand());
}
break;
}
}
}
class EnterPresser implements ActionListener{
private JTextField iField;
private JTextArea oArea;
private int state;
private JPanel buttons;
private final String PIN = "1234";
EnterPresser(JTextField in, JTextArea out, int st, JPanel but){
iField = in;
oArea = out;
state = st;
buttons = but;
}
public void actionPerformed(ActionEvent e){
if(state == 0){
String fieldText = iField.getText();
if(fieldText.equals(PIN)){
iField.setText("");
state = 1;
uiState0To1();
}
}
}
public void uiState0To1(){
buttons.remove(one);
}
}
我不确定您要删除哪些组件,但您的问题很清楚。 ATM class 中定义的所有组件都不是 public。从其他 classes 操作这些组件的一种方法是将它们设置为 public.
最简单的方法是将它们声明为"public static"并通过ATMclass静态引用它们。根据您的情况,您可能需要多个 ATM 实例,在这种情况下,您不会将它们声明为静态的。
这是另一个有很好信息的问题:Difference between public static and private static variables
解决您的问题很简单。您需要某种方式让您的 ButtonPresser
class 与您的 ATM
class 交谈,这是 Observer Pattern[= 的 classic 示例19=]
这个想法是,你会提供某种事件通知,你的 ButtonPresser
会在特定条件下触发,然后你的 ATM
class 会监听这些事件,它会然后根据这些事件决定它应该做什么。
ButtonPresser
不负责修改ATM
的状态,所以我们很清楚。
您现在正在进入 Model-View-Controller, which could provide you a means to utilise CardLayout
的领域,这将进一步降低问题的整体复杂性,但也会隔离责任并解耦您的代码