-3

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

文件名是“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
4

3 回答 3

2

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

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

编辑

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

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

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

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

  • 在此处检查 Java 编码约定。
于 2013-08-11T12:22:56.003 回答
2

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

删除this.或使用foo.this.jtp(并解决您的大小写问题,并遵守 Java 命名约定:类以大写字母开头,而方法和变量以小写字母开头)。

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
    }
}

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

于 2013-08-11T12:23:08.810 回答
1

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

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

这遵循Java 命名约定,其中类以大写字母开头,变量以小写字母开头。

这涉及重命名

  • foo->Foo
  • 变量Things->things
于 2013-08-11T12:21:08.597 回答