1

我有一个带有 2 个 JButton 的 GUI,我想知道哪个是通过使用 getSource 方法触发事件的。我在 Google 上到处寻找解决问题的方法,但找不到,这是我的代码:

@Override
public void actionPerformed(ActionEvent event){
    if (event.getSource() == btn1){
        System.out.println("this should work");
    }else if (event.getSource() == btn2){
        System.out.println("this should work as well");
    }

但是当我按下任何一个按钮时它都不会打印任何东西,我也试过这个:

 @Override
 public void actionPerformed(ActionEvent event){
     if ((JButton)event.getSource() == btn1){
         System.out.println("this should work");
     }else if ((JButton)event.getSource() == btn2){
         System.out.println("this should work as well");
    }

但这也没有用。

有人可以告诉我有什么问题吗?

4

3 回答 3

0

您的代码存在问题:

btn1btn2不要指向堆中相同的按钮实例。意味着它们不一样。这不会打印任何内容,因为即使您的else条件相同。

解决方案

使用按钮上的文本来检测按下了什么按钮:

((JButton)event.getSource()).getText().equals("mybutton")
于 2013-05-26T04:46:42.600 回答
0

我建议对你的按钮使用 2 个不同的 actionListener,所以你不必这样做(如果有的话)

btn.addActionListener(new MyActionListener1());
btn2.addActionListener(new MyActionListener2());

但是如果你想测试你的问题,我建议你将你的变量 btn1 和 btn2 声明为 final。

final JButton btn1= new JButton();
final JButton btn2= new JButton();

所以你可以确保你的变量总是“指向”同一个位置。您可以做的另一件事是将属性名称设置为按钮,以便您可以使用该属性执行等于

btn1.setName("name");

并在 actionListener

@Override
public void actionPerformed(ActionEvent event){
    if ( btn1.getName().equals( ( (Component)event.getSource() ).getName()){
        System.out.println("this should work");
      ....
于 2013-05-26T05:45:18.240 回答
0

我遇到了同样的问题。后来我意识到我正在初始化同一个按钮 2 次。

在我使用的课程中

按钮 b1,b2;

后来在构造函数的初始化方法中我写了

Button b1=new Button();
Button b2=new Button();

这是错误的,因为这样 b1 和 b2 将指向一个新地址。

在构造函数的初始化方法中正确的写法是:

b1=new Button();
b2=new Button();

这样,变量将保存新按钮类的对象,并且地址不会改变。

希望这可以帮助。

于 2016-03-13T08:49:08.403 回答