【问题标题】:Java Action Listener and JButtonsJava 动作侦听器和 JButton
【发布时间】:2016-10-11 19:14:10
【问题描述】:

我有一个 gui 类,它有三个不同的 JButtons 链接到一个 ActionListener

ActionListener 类中,我希望在这三个JButtons 之间进行交互,以使程序能够“记住”之前单击了哪个按钮。

例如:

  1. 如果 button1 被点击 --> 记住这一点,
  2. 然后当 button2 被点击时:做一个相对于 button1 被点击的动作。

换句话说,如果 button1 点击,现在在 if 子句中检查 button2 点击。

现在getActionCommand() 不允许我使用嵌套的 if 语句,因为它只检查当前单击的按钮并且没有“内存”。

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
    }
  }
}

【问题讨论】:

  • gets clicked next 是什么意思?是否允许他同时不允许查看他的电子邮件?

标签: java swing jbutton actionlistener actionevent


【解决方案1】:

根据我对您要做什么的理解...

因此,实现此目的的一种方法是创建一个布尔值的实例变量,因此如果该按钮之前已被单击,则将设置为 true,然后您可以检查您的方法内部是否将该标志设置为 true。 这种方法的缺点是,一旦单击一次,该标志将始终为真。您必须实施一种重置此标志的方法。

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
   }
}

【讨论】:

  • 我一直在寻找比这更优雅的方法,比如动作监听器中内置的属性。但是我最终还是使用了这种方法,因为它可以完成工作,而且这里的其他答案也是如此。
【解决方案2】:

你已经给了 ActionListener behavior -- 它有一个 actionPerformed 方法,但是你还没有给它 state -- 允许它记住哪里的字段它是什么,它做了什么。这里可能只需要一两个布尔字段。可以是该字段,也可以是放置最后按下按钮的 JButton 字段——这一切都取决于您要如何处理此信息。

例如,如果您正在编写一个记忆游戏,那么您可以有一个 JButton 字段来保存最后按下的按钮。如果该字段在 actionPerformed 上为空,则您知道用户正在按下第一个按钮,因此您将其分配给该字段。如果在按下 actionPerformed 时该字段包含一个按钮,那么您知道第二个按钮被按下。如果和第一个不一样,你比较图像图标并做出相应的行为,然后将 JButton 字段设置为 null。

【讨论】:

    【解决方案3】:

    我只是假设你只想按下最后一个按钮,所以你只需要一个变量来存储你的最后一个按钮。 如果你想要完整的按钮按下历史,只需使用一个数组来添加你按下的按钮。

    PS:这对 ActionListeners 使用了 java 8 lambdas。

    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;
    }
    

    【讨论】:

    • 如何将 b1.addActionListener((e) 之类的内容指向 onButton1Pressed()) 之类的特定方法;
    • 这行代码是这样做的:b1.addActionListener((e)-> onButton1Pressed());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多