我有不同的AdjustmentListeners,如:
a.addAdjustmentListener(this);
b.addAdjustmentListener(this);
c.addAdjustmentListener(this);
我有一个实现adjustValueChanged的方法:
public void adjustmentValueChanged(AdjustmentEvent e){
}
我想基于调用a,b,c中的哪一个来执行不同的操作。让我们说,
public void adjustmentValueChanged(AdjustmentEvent e){
String a = //the method I am looking for
if(a == "a") {
// do something
} else if(a == "b"){
// do something else
} else if(a == "c"){
// do something else
}
}
我知道对于ActionEvent,有getActionCommand()。toString()。对于AdjustmentEvent有类似的东西吗?
或者我该如何处理发生的事件?
更明确的是,a,b,c是JScrollbars。
答案 0 :(得分:2)
您可以为a,b,c:
设置名称JScrollbar a = ...;
a.setName("a");
并在侦听器方法中评估名称以找出导致事件的滚动条:
public void adjustmentValueChanged(AdjustmentEvent e){
String name = ((JScrollbar)e.getAdjustable()).getName();
if ("a".equals(name)) {
// do a something
} else if ...
另一种解决方案可能是将可调参数与a,b,c的引用进行比较,如果它们存储在侦听器方法可访问的字段中:
JScrollbar a, b, c; // class fields in the listener or an outer class
public void adjustmentValueChanged(AdjustmentEvent e){
if (a == e.getAdjustable()) {
// do a something
} else if ...
答案 1 :(得分:1)
AdjustmentEvent扩展了AWTEvent,后者又扩展了java.util.EventObject,它具有方法getSource(),它返回对导致事件的元素的引用,以及允许您为事件设置源的setSource()。
您基本上可以尝试以下方法来区分事件的来源:
public void adjustmentValueChanged(AdjustmentEvent e){
if(e.getSource() == a) {
// do something
} else if(e.getSource() == b){
// do something else
} else if(e.getSource() == c){
// do something else
}
}
如有必要,您可以将事件转换为对象
public void adjustmentValueChanged(AdjustmentEvent e){
JScrollbar temp = (JScrollbar) e.getSource();
if(temp == a) {
// do something
} else if(temp == b){
// do something else
} else if(temp == c){
// do something else
}
}
答案 2 :(得分:1)
这种方法无法扩展 - 如果你有更多滚动条怎么办?突然间你会有很大的if-then或switch语句。
清洁工(以及更多OO,如果这对你很重要)是每个滚动条使用一个特定的监听器。
如果您需要访问父类的内部值(在示例中为this
),则可以使用匿名类。使用Java 8的lambas,生成的代码更清晰。
public class Example {
// ...
private void initUI() {
// ...
a.addAdjustmentListener(e -> foo());
b.addAdjustmentListener(e -> bar());
// or do something directly within the lambda...
c.addAdjustmentListener(e -> System.out.println("c changed"));
}
private void foo(final JScrollBar scrollBar) {
// do something based on the provided scroll bar
}
private void bar(final JScrollBar scrollBar) {
// do something based on the provided scroll bar
}
}