单击一下JButton

时间:2014-02-02 16:36:29

标签: java user-interface jbutton

有没有办法知道JButton是否被连续点击?考虑一下我的代码。

public void actionPerformed(ActionEvent arg0) {
    String bucky[] = new String[2];
    String firstclick = null, secondclick = null;
    clicks++;
    if (clicks == 1) {
        bucky[0] = firstclick;
    } else if(clicks == 2) {
        bucky[1] = secondclick;
        if (bucky[0] == bucky[1]) {
            //This JButton was clicked twice in a row.
        }
    }

此代码检查我的JButton被点击的整个次数,并显示消息“此按钮已连续两次点击”。我想要的是比较该按钮的两次点击,看看它们是一个接一个地来,而不是计算点击次数。或者是否有内置函数来执行此操作?

3 个答案:

答案 0 :(得分:2)

只需使用字段记住上次点击的按钮是什么:

private JButton lastButtonClicked;

...

someButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (lastButtonClicked == e.getSource()) {
            displayError();
        }
        else {
            lastButtonClicked = (JButton) e.getSource();
            doSomething();
        }
    }
});

当然,你必须对所有其他按钮做同样的事情。

答案 1 :(得分:0)

布尔值的全局变量数组,每个按钮一个,第一次点击设置为true,设置为false或秒,应该这样做

答案 2 :(得分:0)

我对你的问题有不同的解决方法:

  • 您希望不允许用户连续两次按某些按钮组中的相同按钮。
  • 到目前为止,您的解决方案已尝试检查最后按下了哪个按钮,然后警告用户是否连续按下了相同的按钮。
  • 也许更好的解决方案是创建一个不允许用户连续两次按下相同按钮的构造。
  • 您可以创建ButtonGroup之类的对象,有选择地禁用按下的最后一个按钮,并启用所有其他按钮。
  • 您可以为此类提供add(AbstractButton btn)方法,以允许您添加您希望以这种方式运行的所有按钮。然后该按钮将添加到ArrayList。
  • 你会给它一个侦听所有按钮的ActionListener。每当按下actionPerformed方法时,它会启用所有按钮,然后有选择地禁用按下的最后一个按钮。

例如,请考虑下面的课程:


public class NoRepeatButtonGroup implements ActionListener {
   private List<AbstractButton> btnList = new ArrayList<>();

   public void add(AbstractButton btn) {
      btnList.add(btn);
      btn.addActionListener(this);
   }

   @Override
   public void actionPerformed(ActionEvent evt) {
      for (AbstractButton btn : btnList) {
         btn.setEnabled(true);
      }
      ((AbstractButton) evt.getSource()).setEnabled(false);
   }

   public void reset() {
      for (AbstractButton btn : btnList) {
         btn.setEnabled(true);
      }
   }
}

如果你在类中创建了一个创建按钮的单个对象,并将每个按钮添加到该类的对象,你的代码将自动禁用最后一个按钮,并在其他按钮被重新启用后重新启用它按压。

您可以像这样使用它:

  JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
  NoRepeatButtonGroup noRepeatButtonGroup = new NoRepeatButtonGroup();

  JButton yesButton = new JButton(new YesAction());
  noRepeatButtonGroup.add(yesButton);
  buttonPanel.add(yesButton);

  JButton noButton = new JButton(new NoAction());
  noRepeatButtonGroup.add(noButton);
  buttonPanel.add(noButton);

  JButton maybeButton = new JButton(new MaybeAction());
  noRepeatButtonGroup.add(maybeButton);
  buttonPanel.add(maybeButton);

例如,这里是概念证明最小可运行示例:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class NoneInARowBtns {
   private static void createAndShowGui() {
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      NoRepeatButtonGroup noRepeatButtonGroup = new NoRepeatButtonGroup();

      int buttonCount = 5;
      for (int i = 0; i < buttonCount; i++) {
         JButton btn = new JButton(new ButtonAction(i + 1));
         noRepeatButtonGroup.add(btn);
         buttonPanel.add(btn);
      }

      JOptionPane.showMessageDialog(null, buttonPanel);

   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class ButtonAction extends AbstractAction {
   public ButtonAction(int i) {
      super("Button " + i);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      System.out.println(e.getActionCommand() + " Pressed");
   }
}

class NoRepeatButtonGroup implements ActionListener {
   private List<AbstractButton> btnList = new ArrayList<>();

   public void add(AbstractButton btn) {
      btnList.add(btn);
      btn.addActionListener(this);
   }

   @Override
   public void actionPerformed(ActionEvent evt) {
      for (AbstractButton btn : btnList) {
         btn.setEnabled(true);
      }
      ((AbstractButton) evt.getSource()).setEnabled(false);
   }

   public void reset() {
      for (AbstractButton btn : btnList) {
         btn.setEnabled(true);
      }
   }
}

当上述程序运行时,按下第二个按钮时,您将看到它被禁用:

2nd button pressed

然后当按下第3个按钮时,第2个按钮重新启用,第3个按钮被禁用:

enter image description here

等第4个按钮....

enter image description here