SwingWorker在引用类成员时给出“找不到符号”错误

时间:2013-08-11 12:15:22

标签: java swing swingworker

与SSCE一起链接到编译错误的粘贴: http://pastebin.com/upYzbHN1

Filename是'foo.java'。用'javac foo.java'编译。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.List;

public class foo extends JFrame {
        HashMap<Integer,Thing> Things = new HashMap<Integer,Thing>();
        JTextPane jtp = new JTextPane();

        public void findThings() {
                SwingWorker<HashMap<Integer,Thing>,Thing> sw1 = new SwingWorker<HashMap<Integer,Thing>,Thing>() {
                        protected HashMap<Integer,Thing> doInBackground() {
                                HashMap<Integer,Thing> things = new HashMap<Integer,Thing>();
                                Thread.sleep(1000);
                                return things;
                        }

                        protected void process(List<Thing> chunks) {
                                for(Thing thing : chunks) {
                                        this.things.put(thing.id, thing);
                                        this.jtp.setText(String.valueOf(this.things.size()));
                                }
                        }
                };

                sw1.execute();
        }

        public foo() {
                super();
                setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JButton jbtn = new JButton("findThings()");
                jbtn.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                findThings();
                        }
                });
                add(jbtn);
                this.jtp.setPreferredSize(new Dimension(300,300));
                add(this.jtp); 

                setLocationRelativeTo(null);
                pack();
                setVisible(true);
        }

        public static void foo(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                                new foo();
                        }
                });
        }

        private class Thing {
                public Thing() {
                        id = 100;
                        name = "Thing's name";
                }

                Integer id = null;
                String name = null;
        }
}

给出了这些编译错误:

foo.java:21: error: cannot find symbol
                                        this.things.put(thing.id, thing);
                                            ^
  symbol: variable things
foo.java:22: error: cannot find symbol
                                        this.jtp.setText(String.valueOf(this.thi
ngs.size()));
                                                                            ^
  symbol: variable things
foo.java:22: error: cannot find symbol
                                        this.jtp.setText(String.valueOf(this.thi
ngs.size()));
                                            ^
  symbol: variable jtp
3 errors

3 个答案:

答案 0 :(得分:2)

您的实例Map被称为Things(大写字母 - 顺便提一下变量命名的错误约定。)

您通过调用things来引用它(小写字母 - 变量应该命名为camelBack,因此这是正确的名称)。

修改

同样如其他答案所述,this将引用工作线程,而不是Foo类实例。

  • 使用Foo.this.things
  • 将您的声明更改为:

    HashMap<Integer,Thing> things = new HashMap<Integer,Thing>(); // lowercased variable name

  • 将您的班级名称更改为Foo

  • 检查Java编码约定here

答案 1 :(得分:2)

您定义了一个扩展SwingWorker的匿名内部类。在此类的方法内,this引用匿名SwingWorker类的当前实例。它不引用当前的foo实例。

删除this.,或使用foo.this.jtp(并修复您的案例问题,并尊重Java命名约定:类以大写字母开头,而方法和变量以小写字母开头)。< / p>

protected void process(List<Thing> chunks) {
    for(Thing thing : chunks) {
        things.put(thing.id, thing); // first way
        Foo.this.jtp.setText(String.valueOf(this.things.size())); // second way
    }
}

(假设尊重约定的代码片段)

答案 2 :(得分:1)

Java区分大小写。因此,变量things未在类foo中定义,而是名为Things。此外,变量未在匿名SwingWorker类的范围内定义。你可以使用

Foo.this.things.put(thing.id, thing);
Foo.this.jtp.setText(String.valueOf(Foo.this.things.size()));

这是Java naming conventions,其中类以大写字母开头,变量以小写字母开头。

涉及重命名

  • 班级foo - &gt; Foo
  • 变量Things - &gt; things