-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 に答える