我有这个代码从我的数据库中读取数据并将其显示在组合框中:
//this is inside a thread
@Override
public void readResponse(InputStream input) throws IOException {
InputStreamReader reader = new InputStreamReader(input);
JSONParser parser = new JSONParser();
Hashtable response = parser.parse(reader);
java.util.List allResult = (java.util.List) response.get("AllResult");
System.out.println(allResult);
try {
String[] data = new String[allResult.size()];
for (int i = 0; i < allResult.size(); i++) {
Object obj = allResult.get(i);
String result = (String) ((Hashtable) obj).get("Status");
String brokerName = (String) ((Hashtable) obj).get("brokerName");
if (result.equalsIgnoreCase("ok")) {
for (int j = 0; j < 4; j++) {
data[i] = brokerName;
}
}
}
ComboBox brokerNames = new ComboBox(data);
assignCon.addComponent(brokerNames);
} catch (Exception ex) {
ex.printStackTrace();
}
} //all these work well
当我点击这样的提交按钮时,我需要从该组合框中获取所选项目:
Button ass = new Button("ASSIGN");
ass.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
String names = brokerNames.getSelectedItem.toString();
}
});
现在,由于我无法从线程外部访问brokerNames,因此它给了我错误。有人可以告诉我我做错了什么吗?或者更好的方法来解决这个问题?谢谢。
答案 0 :(得分:1)
你的假设是关闭的,因为这绝对是没有与Threads有关,而且与变量作用域有关,而且你已经在本地块中声明了brokerNames,这使得变量对任何变量都不可见块外的代码。修复 - 使其成为班级中的一个字段。
另一方面,如果您要在后台线程中将brokerName添加到GUI,那么由于您正在更改可见Swing组件(保存brokerName的容器)的状态,您会因其他原因而遇到危险代码Swing事件线程。这不会导致您遇到的编译器问题,但可能导致间歇性难以调试的异常被抛出。我会在GUI创建时将JComboBox添加到GUI,而不是在后台线程中。