FocusListener - obsługa

0

Pytanie z cyklu "początki". W książce adresowej dodałem focuslistenera do każdego textfielda - w momencie, w którym wprowadzimy pustą daną, focusGained powinno wyświetlić napis "Wprowadź poprawnie dane". Wszystko jest okej, tylko że jeśli chcę wprowadzić następną daną, poprzednia jeszcze nie zdąży się nigdzie zapisać, więc z automatu wyświetla się w nieskończoność napis "Wprowadź poprawnie dane", który się aktualizuje przy każdym przełączaniu okna.

Coś w stylu:

 tMiasto = new JTextField("");
      tMiasto.setBounds(330,75,180,20);
      tMiasto.addFocusListener(new FocusListener() {
         @Override
         public void focusGained(FocusEvent e) {
            tMiasto.setText("");
         }

         @Override
         public void focusLost(FocusEvent e) {
            tMiasto.setText("Wprowadź dane!");
         }
      });

Jakiś pomysł, jak to zrobić poprawnie? :)

0

Tak:

tMiasto = new JTextField("");
tMiasto.setBounds(330,75,180,20);
tMiasto.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
		tMiasto.setText("");
    }
 
    @Override
    public void focusLost(FocusEvent e) {
		if (tMiasto.getText().isEmpty()) {
			tMiasto.setText("Wprowadź dane!");
		}
    }
});
 

lub tak:

String promptText = "Wprowadź poprawne dane";
tMiasto = new JTextField(promptText);
tMiasto.setBounds(330,75,180,20);
tMiasto.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
		if (tMiasto.getText().equals(promptText)) {
			tMiasto.setText("");
		}
    }
 
    @Override
    public void focusLost(FocusEvent e) {
		if (tMiasto.getText().isEmpty() {
			tMiasto.setText("Wprowadź dane!");
		}
    }
});
1
         @Override
         public void focusLost(FocusEvent e) {
            tMiasto.setText("Wprowadź dane!");
         }

Przecież nie sprawdzasz czy dane są puste, zawsze po zdjęciu fokusu wyświetlasz komunikat. Może jakoś tak:

         @Override
         public void focusLost(FocusEvent e) {
            if(tMiasto.getText().isEmpty())
            {
                tMiasto.setText("Wprowadź dane!");
                tMiasto.requestFocus();
            }
         }
0

Dzięki wielkie. Nie wiedziałem, do czego konkretnie funkcje służą i treść "focusGain" zinterpretowałem jako warunek:v. I tak właściwie rzecz biorąc, do czego to focusGained służy? Zacząłem się bawić trochę bardziej zaawansowanie i zależy mi na tym, żeby pole "imię" było wyświetlane tylko i wyłącznie za pomocą liter alfabetu. Wydaje mi się, że stworzyłem poprawny warunek - ale ciągle pojawia się błąd. Ma ktoś pomysł, jak to rozwiązać?

 tImie.addFocusListener(new FocusListener() {
         @Override
         public void focusGained(FocusEvent e) {
            tImie.setText("");
         }

         @Override
         public void focusLost(FocusEvent e) {
            String text = tImie.getText();
            if (!text.matches("[A-Za-z]"))
               tImie.setText("Wprowadź poprawnie dane.");
         }
      });
1

Wyrażenie [A-Za-z] oznacza, że ma to być jeden znak. Jeśli zmienisz to na [A-Za-z]+ to będzie oznaczać 1 lub więcej. [A-Z][a-zA-Z]* Sprawdzi, czy imię zaczyna się z wielkiej litery (* oznacza 0 lub więcej).

1

Dzięki wielkie. Da się jakoś wprowadzić polskie litery?

Zwyczajnie je dodać do wyrażenia, tj. a-zA-ZąćęłńóśźżĄĘŁŃÓŚŹŻ

1 użytkowników online, w tym zalogowanych: 0, gości: 1