2016-11-24 4 views
0

このトピックについて既に質問がありますが、私はユーザがJTextFieldに何かを入力したコードを書いています。ボタンをクリックした後、彼の言葉は彼の言葉が持っていた同じ文字数のアスタリスクの数に置き換えられました。例えば "テーブル"は "****" 。私はこのようにしました:ActionListenerから変数を送信し、別のActionListenerで使用できるようにする

ask.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     String guess = ""; 
     String given = textGive.getText(); 
     for (int i=0; i<given.length(); i++){ 
      String asterisk = "*"; 
      guess += asterisk; 
      textGive.setText(guess); 
     } 

    } 
}); 

私は素晴らしい方法でこれをしなかったことを知っていますが、私はそれをより良くする方法は分かりませんでした。どんな勧告?

これで、Stringと元の単語とアスタリスクの両方をスコープの外に保存して、別のActionListenerでその文字列にアクセスしてさらに変更することができます。 最初に書く前にActionListener私はString guess = ""String given = ""と書いていましたが、何もしなかったようです。 だから、私の二番目にActionListener私は彼に文字列givenを送りたいと思っています。

「囲みスコープで定義された特定の非finalのローカル変数を参照することができません」:

guess.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     String attempt = textGuess.getText(); 
     char att = attempt.charAt(0); 
     for (int i=0; i<5; i++){ 

      if (given.charAt(i)==att){ 
       textGuess.setText("Ok!"); 
      } 
     } 


    } 
}); 

は、Eclipseは言って私にエラーを与えます。

は、私はさらにそれをアクセスもするために givenが最終にする必要があることを理解し、どのように変数が最初 ActionListenerからのテキスト入力に依存している場合があることを行うには?この問題の解決策がいくつかありますか?私は最近、Javaを使い始めたので、言語をあまりよく知らない。

+1

は、フィールドだけではないローカル変数を使用します! –

+1

最初に何を達成したいですか?あなたがここで説明していることは、いくつかのパスワードテキストフィールドなどをしたいと思うように私に聞こえるでしょうか? –

+0

推奨されているのは、 'textGive.setText(guess);'行はforループの外側に置く必要があります。 –

答えて

1

クラスに表示したいものはすべて、ローカル変数ではなくインスタンスフィールドに配置する必要があります。例えば、与えられた変数は、クラス内で宣言されたプライベート非静的フィールドであり、リスナーのactionPerformedメソッド内に埋め込まれた変数ではありません。

は、例えば、

public class Foo extends JPanel { 
    private JButton ask = new JButton("Ask"); 
    private JTextField textGive = new JTextField(10); 
    private String given = ""; // visible throughout the class 

    public Foo() { 
     add(textGive); 
     add(ask); 
     ActionListener listener = e -> { 
      String guess = ""; 
      // String given = textGive.getText(); //visible only within this method 
      given = textGive.getText(); 
      guess = given.replaceAll("\\w", "*"); 
      textGive.setText(guess); 
     }; 

     ask.addActionListener(listener); 
     textGive.addActionListener(listener); // also give the same listener to the JTextField 
    } 
+0

"英語"では、コンストラクタを作成する前に変数を宣言することを意味します。 – Puki

+1

@Puki:いいえ、ここで**変数を宣言するのは重要ではありません。コンストラクタの前でも後でも構いませんが、クラスレベルでなければなりません。 –

+0

はい、私はそれを意味しましたが、うまく言いませんでした。とにかく、今は動作します。助けてくれてありがとう。乾杯! – Puki

関連する問題