【发布时间】: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 堆栈,这就是它目前的实现方式,但它看起来像一团糟。任何建议或替代方案将不胜感激。
【问题讨论】:
-
如果您对每个按钮有不同的操作,您可能应该为每个按钮设置单独的事件处理程序。
if或switch的链只是为了对不同的对象进行不同的操作通常是错误设计的标志。 -
我完全同意 RealSkeptic 的观点。为什么交换机堆栈比 if/else 堆栈更混乱。他们做同样的事情,除了 switch 更糟糕,因为如果你忘记打破它就会失败。每个按钮一个监听器要好得多。
-
为了澄清,实际的事件处理逻辑由每个对象的单独的外部处理程序处理。 switch / if 确定要调用处理程序类中的哪个处理程序。不过我明白你在说什么。我可以直接在处理程序类中直接调用适当的方法,而不是在包含对象的类中使用 switch / if。简单得多。谢谢。
标签: java events event-handling objectname