web-dev-qa-db-ja.com

最後のローカル変数は囲み型で定義されているため、割り当てることができません

ratingS = new JSlider(1, 5, 3); 
ratingS.setMajorTickSpacing(1);
ratingS.setPaintLabels(true);
int vote;

class SliderMoved implements ChangeListener {
    public void stateChanged(ChangeEvent e) {
        vote = ratingS.getValue();
    }
}

ratingS.addChangeListener(new SliderMoved());

上記のコードを書くと、Eclipseはこれを教えてくれます:

別のメソッドで定義された内部クラス内の非最終変数票を参照できません

しかし、finalの前にint voteを追加すると、次のエラーが発生します。

最後のローカル変数投票は、囲み型で定義されているため、割り当てることができません

それで、どのように解決しますか?

16
smartmouse

まあ、標準的なトリックは長さ1のint配列を使用することです。 varをfinalにして、var[0]に書き込みます。データの競合を引き起こさないようにすることが非常に重要です。例としてコードを使用する:

final int[] vote = {0};

class SliderMoved implements ChangeListener {
  public void stateChanged(ChangeEvent e) {
    vote[0] = ratingS.getValue();
  }
}

これはすべて、コールバックの呼び出しを含め、EDTで発生するため、安全である必要があります。匿名クラスの使用も検討する必要があります。

ratingS.addChangeListener(new ChangeListener() {
  public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); }
});
28
Marko Topolnik

voteSliderMovedに移動:

class SliderMoved implements ChangeListener {
    private int vote;
    public void stateChanged(ChangeEvent e) {
        this.vote = ratingS.getValue();
        // do something with the vote, you can even access
        // methods and fields of the outer class
    }
    public int getVote() {
        return this.vote;
    }
}

SliderMoved sm = new SliderMoved();
ratingS.addChangeListener(sm);

// if you need access to the actual rating...
int value = rattingS.getValue();

// ...or
int value2 = sm.getVote();

[〜#〜]編集[〜#〜]

または、モデルクラスを変更リスナーに渡します

public class Person {
    private String name;
    private int vote;
    public int getVote() {
        return this.vote;
    }
    public void setVote(int vote) {
        this.vote = vote;
    }
    // omitting other setter and getter
}

Personは次のように使用されます:

 class SliderMoved implements ChangeListener {
    private Person person;
    public SliderMoved(Person person) {
        this.person = person;
    }
    public void stateChanged(ChangeEvent e) {
        this.person.setVote(ratingS.getValue());
    }
    public Person getPerson() {
        return this.person;
    }
}

Person person = new Person();

ratingS.addChangeListener(new SliderMoved(person));

// access the vote
int vote = person.getVote();
5
Peter Keller

コンパイラーのコンプライアンスレベルを1.8に設定すると、同様の問題を解決できました。理由はわかりませんが、試してみてください。

使い方:

プロジェクトを右クリックします->プロパティ-> Javaコンパイラ。そしてJavaコンパイラプロパティウィンドウで、コンパイラのコンプライアンスレベルを1.8に設定します。

2
Nadeem

最後に、メインクラスで投票をインスタンス変数(プライベート)として宣言することを解決しました。

2
smartmouse