Java - 如何更改'本地?'事件监听器中的变量

时间:2013-01-17 15:10:28

标签: java variables event-handling

快速提问我希望有人能回答。基本上我有一个String变量,需要根据组合框中的值进行更改,该组合框中附加了一个事件监听器。然而,如果我把弦变成最后那么它就不能改变,但是如果我不把它变成最终那么eclipse就会呻吟说它不是最终的。什么是最好的(也是最简单的)解决方法?

代码如下

final String dialogOutCome = "";

//create a listener for the combo box
Listener selection = new Listener() {

    public void handleEvent(Event event) {
    //get the value from the combo box
    String comboVal = combo.getText();

    switch (comboVal) {
         case "A": dialogOutCome = "a";
         case "B": dialogOutCome = "b";
         case "C": dialogOutCome = "c";
         case "D": dialogOutCome = "d";
    }
   }
};

6 个答案:

答案 0 :(得分:5)

你不能。

考虑一下:

  • 只要在运行中声明它的方法,就存在局部变量。
  • 一旦该方法调用结束(通常因为该方法存在),该变量就会消失
  • 听众可以(并且通常会)活得更久

那么当方法返回并且侦听器试图修改局部变量时会发生什么?

因为这个问题没有真正好的答案,所以他们决定不允许访问非final局部变量,从而使这种情况变得不可能。

解决此问题的方法有两种:

  • 尝试更改字段而不是局部变量(这可能也更适合侦听器的生命周期)
  • 使用final局部变量,您可以使用单个元素更改内容(例如ListString[]。< / LI>

答案 1 :(得分:3)

这些答案都告诉你如何在表面层面上制造一个有缺陷的方法“工作”。

真正的问题是您尝试将传统的,同步的,“调用/返回”编码模式应用于不支持它的库。真正的答案是当你正在等待的事件异步发生时,你想要在事件发生后的事情也必须异步发生。了解Swing事件驱动的本质对于在其中发挥作用至关重要。

换句话说,想一想代码片段dialogOutCome。是否会执行某些操作?如果是这样,请从处理程序(或作为处理程序的结果)执行该操作

答案 2 :(得分:2)

另一种方法是使用这种方法。

public class ReturnValueListener implements Listener {

    private String dialogOutCome;

    public void handleEvent(Event event) {
        //get the value from the combo box
        String comboVal = combo.getText();

        switch (comboVal) {
            case "A": dialogOutCome = " gay";
            ase "B": dialogOutCome = " ugly";
            case "C": dialogOutCome = " smelly";
            case "D": dialogOutCome = " great";
        }
    }

    public String getDialogOutCome() {
        return dialogOutCome;
    }
}

Listener selection = new ReturnValueListener();
//Set my listener somewhere,
....registerListener(selection);
//After my handleEvent is called
String dialogOutCome = selection.getDialogOutCome();

答案 3 :(得分:1)

只需创建简单的StringWrapper对象:

static class StringWrapper {
       String value;

       StringWrapper(String value) {
           this.value = value;
       } 
}

并在字段类型dialogOutCome中使用它:

final StringWrapper dialogOutCome = new StringWrapper("");

Listener selection = new Listener() {

    public void handleEvent(Event event) {
        String comboVal = combo.getText();

        switch (comboVal) {
          case "A": dialogOutCome.value = " gay";
          case "B": dialogOutCome.value = " ugly";
          case "C": dialogOutCome.value = " smelly";
          case "D": dialogOutCome.value = " great";
        }
   }
};

答案 4 :(得分:0)

您可以使用setter进行间接寻址。这将取消最终的限制(因为您访问的字段是'this'而不是'dialogOutcome'。

String dialogOutCome = "";

void setOutcome(String value){
  dialogOutCome = value;
}

//create a listener for the combo box
Listener selection = new Listener() {

    public void handleEvent(Event event) {
    //get the value from the combo box
    String comboVal = combo.getText();

    switch (comboVal) {
         case "A": setOutcome(" gay");
         case "B": setOutcome(" ugly");
         case "C": setOutcome(" smelly");
         case "D": setOutcome(" great");
    }
   }
};

答案 5 :(得分:-2)

解决方法解决方案:使用 StringBuilder 而不是String。当然,StringBuilder中的handleEvent无法更改引用,但我们可以调用其方法。

    final StringBuilder sb = new StringBuilder();

    Listener selection = new Listener() {

        public void handleEvent(Event event) {
        ...
        switch (comboVal) {
             case "A": sb.delete(0, sb.length()).append("a");
             case "B": sb.delete(0, sb.length()).append("b");
            ...
        }
       }
    };

...
System.out.println(sb.toString());

然后你可以通过StringBuilder.toString();

获得字符串值

编辑:请提供回答此答案的理由。