获取 Java 中的事件源

Getting source of an event in Java

有什么方法可以获取事件的来源吗?我知道 event.getSource() 但是,有没有办法将它转换成字符串?

例如,如果源是按钮 button1,是否可以将值 button1 赋给字符串变量? (我要处理很多按钮,所以我不会写 if 语句)

正如 DaaaahWhoosh 在他的评论中所述,您可以通过构造函数将任何您想要的内容传递给动作侦听器。

package com.ggl.fse;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ButtonActionListener implements ActionListener {

    private String buttonText;

    public ButtonActionListener(String buttonText) {
        this.buttonText = buttonText;
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub

    }

}

按钮文本字符串将在 actionPerformed 方法中可用。

您可以为每个 JButton 使用特定的 ActionListener。试试这个代码:

private static String text;


public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(200, 200, 200, 200);
    frame.setLayout(new BorderLayout());

    JButton button1 = new JButton("Button 1");
    button1.addActionListener(new ActionListener() {
        @Override public void actionPerformed(ActionEvent e) {
            text = button1.getText();
            JOptionPane.showMessageDialog(null, "Text is: " + text);
        }
    });

    JButton button2 = new JButton("Button 2");
    button2.addActionListener(new ActionListener() {
        @Override public void actionPerformed(ActionEvent e) {
            text = button2.getText();
            JOptionPane.showMessageDialog(null, "Text is: " + text);
        }
    });

    frame.add(button1, BorderLayout.NORTH);
    frame.add(button2, BorderLayout.SOUTH);
    frame.setVisible(true);
}

为了清楚起见:

getSource() 方法 returns 最初发生事件的对象。您可以使用它从元素中获取某种 属性,例如标签内的文本或按钮的名称。

这些是字符串,但如果您选择走这条路,我会确保您选择在将调用它的所有组件中统一的东西 ActionListerner

这就是 getActionCommand() 可能派上用场的地方。您可以在创建组件时设置唯一性 'identifiers',并在以后访问它们。

JButton button = new JButton("Button");
button.setActionCommand("1");

JButton button = new JButton("Button");
button.setActionCommand("2");

然后你可以稍后使用你喜欢的任何方法比较这些,或者你可以做一些花哨的事情,比如这样(因为你说过你不想使用 if-else 语句):

String command = e.getActionCommand();
int i = Integer.parseInt(command);

switch (i) {
    case 1: // do something
        break;
}

根据 Java 文档:

Returns the command string associated with this action. This string allows a "modal" component to specify one of several commands, depending on its state. For example, a single button might toggle between "show details" and "hide details". The source object and the event would be the same in each case, but the command string would identify the intended action.

请记住,我认为只有当您对许多组件使用一个 ActionListerner 时,这才是最佳方法。正如另一个答案所指出的,您可以为每个按钮制作唯一的 ActionListeners

希望对您有所帮助!