Java 动作侦听器和 JButton
Java Action Listener and JButtons
我有一个 gui class,其中三个不同的 JButtons
链接到一个 ActionListener
。
在 ActionListener
class 中,我希望这三个 JButtons
之间的交互方式允许程序 "remember" 之前单击了哪个按钮。
例如:
- 如果按钮 1 被点击 --> 记住这一点,
- 然后当button2接下来被点击时:做一个与button1被点击相关的动作。
换句话说,如果 button1 单击,现在在 if 子句中检查 button2 单击。
现在 getActionCommand()
不允许我使用嵌套的 if 语句,因为它只检查当前单击的按钮并且没有 "memory".
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0){
System.out.println("This is Jug 0");
// wont be able to print the following
if (Integer.parseInt(e.getActionCommand()) == 1){
System.out.println("This is Jug 1 AFTER jug 0"); //I will never be able to print this
}
}
}
你已经给了 ActionListener behavior -- 它有一个 actionPerformed 方法,但是你还没有给它 state - - 允许它记住它在哪里以及它做了什么的字段。您在这里可能只需要一个或两个布尔字段。要么是那个,要么是你放置最后一个按下按钮的 JButton 字段——这一切都取决于你想用这个信息做什么。
例如,如果您正在编写记忆游戏,那么您可以有一个 JButton 字段来保存最后按下的按钮。如果该字段在 actionPerformed 上为 null,则您知道用户正在按下第一个按钮,因此您将其分配给该字段。如果按下 actionPerformed 时该字段包含一个按钮,那么您就知道按下了第二个按钮。如果它与第一个不一样,则比较图像图标并相应地进行操作,然后将 JButton 字段设置为 null。
我只是假设你只想按下最后一个按钮,所以你只需要一个变量来存储你最后一个按钮。
如果您想要完整的按钮按下历史记录,只需使用一个数组来添加您按下的按钮。
PS:这对 ActionListeners 使用 java 8 个 lambda。
private void initComponents() {
JButton b1 = new JButton();
JButton b2 = new JButton();
JButton b3 = new JButton();
b1.addActionListener((e)-> onButton1Pressed());
b2.addActionListener((e)-> onButton2Pressed());
b3.addActionListener((e)-> onButton3Pressed());
}
int lastButton = -1;
private void onButton1Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 1;
}
private void onButton2Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 2;
}
根据我对你想要做什么的理解...
因此,实现此目的的一种方法是创建一个布尔型实例变量,如果之前已单击该按钮,则将设置为真,然后您可以在您的方法中检查该标志是否已设置为真。
这种方法的缺点是,一旦单击一次,该标志将始终为真。您必须实施一种方法来重置此标志。
private boolean hasButtonOneBeenPressed = false; //set this to true when the button has been clicked
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0 && !hasButtonOneBeenPressed){
System.out.println("This is Jug 0");
// wont be able to print the following
} else if(Integer.parseInt(e.getActionCommand()) == 1 && hasButtonOneBeenPressed){
System.out.println("This is Jug 1 AFTER jug 0");
} else {
//do something else
}
}
我有一个 gui class,其中三个不同的 JButtons
链接到一个 ActionListener
。
在 ActionListener
class 中,我希望这三个 JButtons
之间的交互方式允许程序 "remember" 之前单击了哪个按钮。
例如:
- 如果按钮 1 被点击 --> 记住这一点,
- 然后当button2接下来被点击时:做一个与button1被点击相关的动作。
换句话说,如果 button1 单击,现在在 if 子句中检查 button2 单击。
现在 getActionCommand()
不允许我使用嵌套的 if 语句,因为它只检查当前单击的按钮并且没有 "memory".
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0){
System.out.println("This is Jug 0");
// wont be able to print the following
if (Integer.parseInt(e.getActionCommand()) == 1){
System.out.println("This is Jug 1 AFTER jug 0"); //I will never be able to print this
}
}
}
你已经给了 ActionListener behavior -- 它有一个 actionPerformed 方法,但是你还没有给它 state - - 允许它记住它在哪里以及它做了什么的字段。您在这里可能只需要一个或两个布尔字段。要么是那个,要么是你放置最后一个按下按钮的 JButton 字段——这一切都取决于你想用这个信息做什么。
例如,如果您正在编写记忆游戏,那么您可以有一个 JButton 字段来保存最后按下的按钮。如果该字段在 actionPerformed 上为 null,则您知道用户正在按下第一个按钮,因此您将其分配给该字段。如果按下 actionPerformed 时该字段包含一个按钮,那么您就知道按下了第二个按钮。如果它与第一个不一样,则比较图像图标并相应地进行操作,然后将 JButton 字段设置为 null。
我只是假设你只想按下最后一个按钮,所以你只需要一个变量来存储你最后一个按钮。 如果您想要完整的按钮按下历史记录,只需使用一个数组来添加您按下的按钮。
PS:这对 ActionListeners 使用 java 8 个 lambda。
private void initComponents() {
JButton b1 = new JButton();
JButton b2 = new JButton();
JButton b3 = new JButton();
b1.addActionListener((e)-> onButton1Pressed());
b2.addActionListener((e)-> onButton2Pressed());
b3.addActionListener((e)-> onButton3Pressed());
}
int lastButton = -1;
private void onButton1Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 1;
}
private void onButton2Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 2;
}
根据我对你想要做什么的理解...
因此,实现此目的的一种方法是创建一个布尔型实例变量,如果之前已单击该按钮,则将设置为真,然后您可以在您的方法中检查该标志是否已设置为真。 这种方法的缺点是,一旦单击一次,该标志将始终为真。您必须实施一种方法来重置此标志。
private boolean hasButtonOneBeenPressed = false; //set this to true when the button has been clicked
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0 && !hasButtonOneBeenPressed){
System.out.println("This is Jug 0");
// wont be able to print the following
} else if(Integer.parseInt(e.getActionCommand()) == 1 && hasButtonOneBeenPressed){
System.out.println("This is Jug 1 AFTER jug 0");
} else {
//do something else
}
}