从线程

时间:2015-10-22 11:35:16

标签: java multithreading swing combobox actionlistener

我有这个代码从我的数据库中读取数据并将其显示在组合框中:

                //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,因此它给了我错误。有人可以告诉我我做错了什么吗?或者更好的方法来解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:1)

你的假设是关闭的,因为这绝对是没有与Threads有关,而且与变量作用域有关,而且你已经在本地块中声明了brokerNames,这使得变量对任何变量都不可见块外的代码。修复 - 使其成为班级中的一个字段。

另一方面,如果您要在后台线程中将brokerName添加到GUI,那么由于您正在更改可见Swing组件(保存brokerName的容器)的状态,您会因其他原因而遇到危险代码Swing事件线程。这不会导致您遇到的编译器问题,但可能导致间歇性难以调试的异常被抛出。我会在GUI创建时将JComboBox添加到GUI,而不是在后台线程中。