getSource()和getActionCommand()

26

什么是getSource?它返回什么?

而getActionCommand()又是什么?它返回什么?

我对这两个功能感到困惑,有人可以给我解释一下吗?在UI的TextField或JTextField中,getSource和getActionCommand()有什么用途?


你不理解 API 文档的哪个部分? - kleopatra
我对它的工作原理有想法,只是需要更深入和密集的信息。 - user962206
4个回答

26
假设你在谈论 ActionEvent 类,那么这两种方法之间存在很大的区别。 getActionCommand() 方法会返回一个代表动作命令的字符串。它的值是组件特定的;对于 JButton ,你可以使用 setActionCommand(String command) 方法设置该值,但是对于 JTextField ,如果你没有设置该值,它将自动给出文本字段的值。根据 javadoc 的说明,这是为了与 java.awt.TextField 兼容性而设计的。 getSource() 方法由 EventObject 类指定,ActionEvent 是该类的子类(通过 java.awt.AWTEvent)。它会给你一个参考对象,即事件来自哪个对象。 编辑: 这里有一个例子。有两个字段,一个明确设置了操作命令,另一个没有。在每个字段中输入一些文本,然后按 Enter 键。
public class Events implements ActionListener {

  private static JFrame frame; 

  public static void main(String[] args) {

    frame = new JFrame("JTextField events");
    frame.getContentPane().setLayout(new FlowLayout());

    JTextField field1 = new JTextField(10);
    field1.addActionListener(new Events());
    frame.getContentPane().add(new JLabel("Field with no action command set"));
    frame.getContentPane().add(field1);

    JTextField field2 = new JTextField(10);
    field2.addActionListener(new Events());
    field2.setActionCommand("my action command");
    frame.getContentPane().add(new JLabel("Field with an action command set"));
    frame.getContentPane().add(field2);


    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(220, 150);
    frame.setResizable(false);
    frame.setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent evt) {
    String cmd = evt.getActionCommand();
    JOptionPane.showMessageDialog(frame, "Command: " + cmd);
  }

}

让我理解一下,getActionCommand会返回我当前聚焦的TextField的值/名称?例如,我有一个名为“TextField1”的JTextField,getActionCommand会返回它的变量名还是文本框内的消息? - user962206
1
正如我在我的答案中所说,如果您没有通过setActionCommand()显式设置操作命令,则getActionCommand()将返回文本字段的内容;即其中输入的任何内容。 - Qwerky

9

getActionCommand()

返回与此操作关联的命令字符串。该字符串允许“模态”组件根据其状态指定多个命令之一。例如,单个按钮可以在“显示详细信息”和“隐藏详细信息”之间切换。源对象和事件在每种情况下都相同,但命令字符串将标识预期的操作。

在我看来,如果您想要使用单个命令组件根据其状态触发不同的命令,则使用此方法可以使处理程序执行正确的代码行。

JTextField有一个JTextField#setActionCommand(java.lang.String)方法,您可以使用它来设置由其生成的操作事件使用的命令字符串。

getSource()

返回:最初发生事件的对象。

我们可以使用getSource()来识别组件并在动作监听器中执行相应的代码行。因此,我们不需要为每个命令组件编写单独的动作监听器。并且由于您拥有对组件本身的引用,因此如果需要,可以根据事件对组件进行任何更改。

如果事件是由JTextField生成的,则ActionEvent#getSource()将为您提供对JTextField实例本身的引用。


1

我使用getActionCommand()来监听按钮。我对每个按钮应用setActionCommand(),以便在执行事件时可以听到event.getActionCommand("按钮的setActionCommand()值")。

例如,对于JRadioButtons,我使用getSource()。我编写返回每个JRadioButton的方法,因此在我的Listener类中,我可以指定每次按下新的JRadioButton时要执行的操作。例如:

public class SeleccionListener implements ActionListener, FocusListener {}

因此,我可以监听按钮事件和单选按钮事件。以下是我如何监听每个事件的示例:

public void actionPerformed(ActionEvent event) {
    if (event.getActionCommand().equals(GUISeleccion.BOTON_ACEPTAR)) {
        System.out.println("Aceptar pressed");
    }

在这种情况下,GUISeleccion.BOTON_ACEPTAR是一个“public static final String”,它被用于JButtonAceptar.setActionCommand(BOTON_ACEPTAR)。
public void focusGained(FocusEvent focusEvent) {
    if (focusEvent.getSource().equals(guiSeleccion.getJrbDat())){
        System.out.println("Data radio button");
    }

在这个例子中,当用户点击具有焦点的任何JRadioButton时,我获取其源代码。guiSeleccion.getJrbDat()返回GUISeleccion类(这是一个Frame)中的JRadioButton的引用。


0

getActionCommand() 方法通过 setActionCommand() 设置的 Component 返回与其关联的字符串,而 getSource() 方法返回指定事件源的 Object 类的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接