快速提问我希望有人能回答。基本上我有一个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";
}
}
};
答案 0 :(得分:5)
你不能。
考虑一下:
那么当方法返回并且侦听器试图修改局部变量时会发生什么?
因为这个问题没有真正好的答案,所以他们决定不允许访问非final
局部变量,从而使这种情况变得不可能。
解决此问题的方法有两种:
final
局部变量,您可以使用单个元素更改内容(例如List
或String[]
。< / 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();
编辑:请提供回答此答案的理由。