与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
答案 0 :(得分:2)
您的实例Map
被称为Things
(大写字母 - 顺便提一下变量命名的错误约定。)
您通过调用things
来引用它(小写字母 - 变量应该命名为camelBack,因此这是正确的名称)。
修改强>
同样如其他答案所述,this
将引用工作线程,而不是Foo
类实例。
Foo.this.things
。将您的声明更改为:
HashMap<Integer,Thing> things = new HashMap<Integer,Thing>(); //
lowercased variable name
将您的班级名称更改为Foo
答案 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