2016-11-24 3 views
0

Ich sehe, dass bereits einige Fragen zu diesem Thema gestellt wurden, aber ich habe noch keine Antwort auf meine Frage gefunden. Ich schreibe einen Code, wo der Benutzer etwas in JTextField eingibt, und nach dem Klicken auf eine Schaltfläche wird sein Wort durch die Anzahl der Sterne mit der gleichen Anzahl von Zeichen ersetzt, die sein Wort hatte, zB "Tabelle" würde ersetzt durch "****" . ich habe es so aus:Eine Variable von ActionListener senden, also kann ein anderer ActionListener es verwenden

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); 
     } 

    } 
}); 

Ich weiß, dass ich dies in einer großen Weise nicht getan, aber ich wusste nicht, wie es besser zu machen. Irgendwelche Empfehlungen?

Nun möchte ich irgendwie beide Zeichenfolgen, das ursprüngliche Wort und das Sternchen außerhalb des Bereichs speichern, damit ich in einem anderen ActionListener darauf zugreifen und es weiter modifizieren kann. Bevor ich zuerst schreibe ActionListener habe ich geschrieben String guess = "" und String given = "" aber es scheint, als ob es nichts getan hat. Also, in meinem zweiten ActionListener möchte ich ihm die Zeichenfolge given senden, die ich erhielt, wenn der Benutzer sein Wort eintippte.

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!"); 
      } 
     } 


    } 
}); 

Eklipse gibt mir Fehler sagen:

"Kann nicht an den nicht-final lokale Variable verweisen in einem umschließenden Umfang gegeben definiert".

Ich verstehe, dass ich given endgültig zu machen, um brauchen sie weiter zu den acces, aber wie das tun, wenn die Variable aus der ersten ActionListener auf Texteingabe abhängt? Gibt es eine andere Lösung für dieses Problem? Ich habe vor kurzem begonnen, Java zu benutzen, also kenne ich die Sprache nicht so gut.

+1

Verwenden Sie einfach Felder nicht auf lokale Variablen! –

+1

Was möchten Sie in erster Linie erreichen? Was du hier beschreibst, klingt für mich so, als ob du ein Passwort-Textfeld oder ähnliches machen möchtest? –

+0

Eine Empfehlung, die Zeile 'textGive.setText (rate);' sollte außerhalb der for-Schleife platziert werden. –

Antwort

1

Alles, was Sie für die Klasse sichtbar sehen möchten, sollte in Instanzfeldern und nicht in lokalen Variablen platziert werden. Die angegebene Variable sollte z. B. ein privates nicht statisches Feld sein, das in der Klasse deklariert ist, und keine Variable, die in der actionPerformed-Methode des Listeners verborgen ist.

z.B.

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

In "Englisch" bedeutet das, Variablen vor dem Erstellen eines Konstruktors zu deklarieren, oder? – Puki

+1

@Puki: Nein. Es spielt keine Rolle ** wo ** Sie die Variable deklarieren. Es kann vor oder nach dem Konstruktor sein, aber es muss auf Klassenebene sein. –

+0

Ja, das habe ich gemeint, aber nicht gut gesagt. Wie auch immer, es funktioniert jetzt. Danke für die Hilfe. Prost! – Puki