【问题标题】:Get name of event source object in java在java中获取事件源对象的名称
【发布时间】:2015-10-24 21:24:10
【问题描述】:

我正在创建许多事件处理程序并保持清洁,而不是为可能成为每个处理程序源的 20 多个对象创建大量 if...else,我正在尝试使用一个开关盒。当然,问题是您不能打开一个对象,即 event.getSource();返回,然后使用 .toString() 返回任何可以轻松用于每种情况的内容。我想知道是否有一种方法可以在字符串中获取事件源对象的名称,可以在开关中使用。一个按钮的文本,而不是它的名称,也可以工作,但我也在尝试用文本框来做到这一点,在这种情况下,只有名称才能真正起作用。我只遇到过一种解决方案,但由于某种原因它不起作用。

public class EntryHandler implements ActionListener 
{
    @Override
    public void actionPerformed( ActionEvent event ) 
    {
        if( event.getSource() == addEntryButton ) 
        {
            Object source = event.getSource();
            String bString;
            if (source instanceof JButton)
            {
                bString = ((JButton) source).getName();
            } else { 
                bString = "Wrong";
            }
            System.out.printf("b name: %s", bString);
            entryData.addTableEntry();
        }  ... more if's for other buttons...

由于某种原因,这总是打印“b name: null”

我总是可以只使用 if...else 堆栈,这就是它目前的实现方式,但它看起来像一团糟。任何建议或替代方案将不胜感激。

【问题讨论】:

  • 如果您对每个按钮有不同的操作,您可能应该为每个按钮设置单独的事件处理程序。 ifswitch 的链只是为了对不同的对象进行不同的操作通常是错误设计的标志。
  • 我完全同意 RealSkeptic 的观点。为什么交换机堆栈比 if/else 堆栈更混乱。他们做同样的事情,除了 switch 更糟糕,因为如果你忘记打破它就会失败。每个按钮一个监听器要好得多。
  • 为了澄清,实际的事件处理逻辑由每个对象的单独的外部处理程序处理。 switch / if 确定要调用处理程序类中的哪个处理程序。不过我明白你在说什么。我可以直接在处理程序类中直接调用适当的方法,而不是在包含对象的类中使用 switch / if。简单得多。谢谢。

标签: java events event-handling objectname


【解决方案1】:

您需要将setName() 用于获取事件的组件表单。然后你不会得到空值,而是你会得到你将设置的任何东西。 例如:

JButton jButton =new JButton();
jButton.setName("name");

另一边当你得到事件时:

event.getSource().getName();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多