【问题标题】:the getSource() and getActionCommand()getSource() 和 getActionCommand()
【发布时间】:2011-11-21 16:21:52
【问题描述】:

什么是getSource?它返回什么?

什么是getActionCommand(),它返回什么??

我对这两者感到困惑,任何人都可以给我或区分它们吗? UI 中的 getSource 和 getActionCommand() 有什么用?具体是 TextField 还是 JTextField?

【问题讨论】:

  • 您不明白 api 文档的哪一部分?
  • 我对它的工作原理有一个想法,我只需要更深入/更密集的信息。

标签: java swing user-interface event-handling action


【解决方案1】:

假设你说的是ActionEvent类,那么这两种方法有很大区别。

getActionCommand() 为您提供一个表示操作命令的字符串。该值是特定于组件的;对于JButton,您可以选择使用setActionCommand(String command) 设置值,但对于JTextField,如果您不设置此值,它将自动为您提供文本字段的值。根据 javadoc,这是为了与 java.awt.TextField 兼容。

getSource()ActionEvent 是子级的 EventObject 类指定(通过 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);
  }

}

【讨论】:

  • 让我得到这个 Straight getActionCommand 返回我的 TextField 的值/名称?我目前关注的是什么?例如,我有一个名为“TextField1”的 JTextField,getActioncommand 将返回给我它是该变量的名称吗?或 TextFie 中的消息;d?
  • 正如我在回答中所说,如果您没有通过setActionCommand() 明确设置操作命令,那么getActionCommand() 将返回文本字段的内容;即在那里输入的任何内容。
【解决方案2】:

getActionCommand()

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

IMO,这在您使用单个命令组件根据其状态触发不同命令的情况下很有用,并且使用此方法您的处理程序可以执行正确的代码行。

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

getSource()

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

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

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

【讨论】:

    【解决方案3】:

    我使用 getActionCommand() 来听到按钮。我将 setActionCommand() 应用于每个按钮,以便每当使用 event.getActionCommand("The setActionCommand() value of the button") 执行事件时我都能听到。

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

    public class SeleccionListener implements ActionListener, FocusListener {}
    

    因此,我可以听到按钮事件和 radioButtons 事件。以下是我如何聆听的示例:

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

    在这种情况下,GUISeleccion.BOTON_ACEPTAR 是一个“公共静态最终字符串”,用于 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 类中的 JRadioButton 的引用(这是一个 Frame)

    【讨论】:

      【解决方案4】:

      getActionCommand() 方法通过 setActionCommand() 返回与该组件集关联的字符串,而 getSource() 方法返回指定事件源的 Object 类的 Object。

      【讨论】:

        猜你喜欢
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多