2016-11-24 3 views
0

이미이 항목에 대해 몇 가지 질문이 있지만 내 대답을 찾지 못했습니다. 나는 사용자가 JTextField에 뭔가를 입력 한 코드를 작성하고 버튼을 클릭 한 후 그의 단어는 "table"이 "****"로 바뀌는 것처럼 그의 단어가 가진 문자 수와 동일한 별표 수로 대체됩니다. . 나는 이렇게했다 :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); 
     } 

    } 
}); 

내가 좋은 방법으로 이것을하지 않았지만 나는 그것을 더 잘하는 방법을 몰랐다. 어떤 추천?

이제 어떻게 든 다른 ActionListener에서 액세스하여 추가 수정할 수 있도록 String, 원래 단어 및 별표를 범위 외부에 저장하고 싶습니다. 처음 쓰기 전에 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!"); 
      } 
     } 


    } 
}); 

이클립스는 말을 나에게 오류를 제공합니다.

나는 내가 그것을 더 액세서하기 위해 given 최종해야 이해하지만 어떻게 변수가 처음 ActionListener에서 텍스트 입력에 의존하는 경우 그렇게 할 수 있나요? 이 문제에 대한 다른 해결책이 있습니까? 나는 최근에 자바를 사용하기 시작 했으므로 언어를 잘 모른다.

+1

그냥 필드 로컬이 아닌 변수를 사용! –

+1

처음에 무엇을 달성하고 싶습니까? 여기서 설명하는 내용은 패스워드 텍스트 필드 등을 사용하려는 것처럼 나에게 들릴 수 있습니까? –

+0

권장 사항 중 하나 인'textGive.setText (guess);'줄은 for 루프 바깥에 있어야합니다. –

답변

1

클래스에 표시하려는 것은 모두 로컬 변수가 아닌 인스턴스 필드에 배치해야합니다. 예를 들어, 주어진 변수는 클래스에 선언 된 private 비 정적 필드 여야하며 리스너의 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

관련 문제