在AWT中获取AdjustmentListener事件的来源

时间:2015-11-17 10:35:18

标签: java events awt listener

我有不同的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。

3 个答案:

答案 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
    }
}
相关问题