2017-12-17 7 views
-3

私はシステムトレイの通知のための機能を妨害しないようにしようとしていますが、変数dnd = falseが "Do Not Disturb - on"に変更されて設定されているif文を作成しようとしています。 dndがtrueに設定されている場合、dnd = falseと設定されていますが、dnd = true;dnd = false;の下に赤い線が表示され、「囲みスコープで定義されたローカル変数dndは最終的にまたは効果的に最終的でなければなりません」と表示されます。助けてください。
ここに私のコード:if文内の変数値を変更できないJava

boolean dnd = false; 
doNotDisturb.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (dnd == false) { 
      dnd = true; 
      doNotDisturb.setName("Do Not Disturb - on"); 
     } else { 
      dnd = false; 
     } 
    } 
}); 
+0

解決策は本当にしたいかによって異なります。 *匿名クラスの外で宣言されたローカル変数に*新しい値を再割当てすることはできません。だから、その変数を匿名クラスに移動したり、上位クラスのフィールドにしたり、ブール値を他の型でラップしたり、ゲッターやセッターによってその状態を変更したりすることができます。 – Pshemo

+0

エラーメッセージで検索しましたか?これを*前にお願いします。 –

答えて

0

変数dndが最終的または効果的に最終でなければなりません(これが事実です)。これが、クロージャのコンテキストから参照できる理由です。 コンパイラは、クロージャークラスまたは匿名クラスの中からdndを再割り当てしないようにします。

あなたがオブジェクトにDNDのいずれか

  1. ラッピングすることによって問題を解決することができます:

    DndConfig dndConfig = new DndConfig();

    と匿名クラスで:

    dndConfig.dnd = true; //your logic

  2. メイキングdndは、メインクラスのインスタンスフィールドです。

関連する問題