Java 动作侦听器和 JButton

Java Action Listener and JButtons

我有一个 gui class,其中三个不同的 JButtons 链接到一个 ActionListener

ActionListener class 中,我希望这三个 JButtons 之间的交互方式允许程序 "remember" 之前单击了哪个按钮。

例如:

  1. 如果按钮 1 被点击 --> 记住这一点,
  2. 然后当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
   }
}