Chcę, aby okno komunikatu pojawiło się natychmiast po zmianie wartości przez użytkownika w polu tekstowym. Obecnie muszę nacisnąć klawisz Enter, aby wyskoczyło okno komunikatu. Czy coś jest nie tak z moim kodem?
textField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (Integer.parseInt(textField.getText())<=0){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Message",
JOptionPane.ERROR_MESSAGE);
}
}
}
Każda pomoc będzie mile widziana!
java
swing
listener
jtextfield
documentlistener
użytkownik236501
źródło
źródło
Zazwyczaj odpowiedź brzmi „użyj
DocumentListener
”. Jednak zawsze uważam ten interfejs za kłopotliwy. Naprawdę interfejs jest przeprojektowany. Ma trzy metody wstawiania, usuwania i zastępowania tekstu, gdy potrzebuje tylko jednej metody: zamiany. (Wstawienie może być postrzegane jako zastąpienie tekstu bez tekstu, a usunięcie może być postrzegane jako zastąpienie tekstu bez tekstu).Zwykle wszystko, co chcesz wiedzieć, to kiedy tekst w polu się zmienił , więc typowa
DocumentListener
implementacja ma trzy metody wywołujące jedną metodę.Dlatego stworzyłem następującą metodę narzędzia, która pozwala używać prostszego
ChangeListener
niżDocumentListener
. (Wykorzystuje składnię lambda Java 8, ale w razie potrzeby można ją dostosować do starej Java).W przeciwieństwie do dodawania detektora bezpośrednio do dokumentu, obsługuje to (niecodzienne) przypadki, w których instalujesz nowy obiekt dokumentu na komponencie tekstowym. Ponadto rozwiązuje problem wymieniony w odpowiedzi Jean-Marc Astesana , w którym dokument czasami wywołuje więcej zdarzeń, niż jest to konieczne.
W każdym razie ta metoda pozwala zastąpić irytujący kod, który wygląda następująco:
Z:
Kod udostępniony publicznie. Baw się dobrze!
źródło
abstract class DocumentChangeListener implements DocumentListener
dodatkową metodę abstrakcyjnąchange(DocumentEvent e)
, którą wywołujesz ze wszystkich 3 innych metod. Wydaje mi się to bardziej oczywiste, ponieważ używa mniej więcej tej samej logiki coabstract *Adapter
słuchacze.changedUpdate
metodę należy wywoływać jawnie poprzez połączenie w ramach każdego z nich,insertUpdate
iremoveUpdate
żeby to zadziałało.Wystarczy utworzyć interfejs, który rozszerza DocumentListener i implementuje wszystkie metody DocumentListener:
i wtedy:
lub możesz nawet użyć wyrażenia lambda:
źródło
Należy pamiętać, że gdy użytkownik zmodyfikuje pole, DocumentListener może czasami odebrać dwa zdarzenia. Na przykład, jeśli użytkownik wybierze całą zawartość pola, a następnie naciśnij klawisz, otrzymasz removeUpdate (cała zawartość jest usuwana) i insertUpdate. W twoim przypadku nie sądzę, że jest to problem, ale ogólnie rzecz biorąc, jest. Niestety wydaje się, że nie ma możliwości śledzenia zawartości pola tekstowego bez podklasy JTextField. Oto kod klasy, która udostępnia właściwość „text”:
źródło
Wiem, że odnosi się to do naprawdę starego problemu, jednak spowodowało to również pewne problemy. Gdy kleopatra odpowiedziała w powyższym komentarzu, rozwiązałem problem za pomocą
JFormattedTextField
. Jednak rozwiązanie wymaga nieco więcej pracy, ale jest fajniejsze.JFormattedTextField
Nie domyślnie wywołać zmianę właściwości po każdym tekst zmienia się w tej dziedzinie. Domyślny konstruktorJFormattedTextField
nie tworzy formatera.Jednak, aby zrobić to, co sugerował PO, musisz użyć formatera, który wywoła
commitEdit()
metodę po każdej poprawnej edycji pola.commitEdit()
Metody jest to, co powoduje zmianę właściwości z tego co widzę i bez formater, to jest wyzwalany domyślnie na zmianę ostrości lub gdy zostanie naciśnięty klawisz Enter.Aby uzyskać więcej informacji, zobacz http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value .
Utwórz domyślny obiekt formatter (
DefaultFormatter
), który zostanie przekazany do niegoJFormattedTextField
za pośrednictwem jego konstruktora lub metody ustawiającej. Jedną z metod domyślnego formatera jestsetCommitsOnValidEdit(boolean commit)
ustawienie formatera na wyzwalaniecommitEdit()
metody przy każdej zmianie tekstu. Można to następnie odebrać za pomocą aPropertyChangeListener
ipropertyChange()
metody.źródło
Ale nie chciałbym po prostu parsować niczego, co użytkownik (może przypadkiem) dotknie jego klawiatury na
Integer
. Powinieneś złapać każdeException
rzucone i upewnić się, żeJTextField
nie jest puste.źródło
Jeśli użyjemy uruchamialnej metody SwingUtilities.invokeLater () podczas korzystania z programu nasłuchiwania dokumentów aplikacja czasami się zacina i wymaga czasu na aktualizację wyniku (zgodnie z moim eksperymentem). Zamiast tego możemy również użyć zdarzenia KeyReleased dla detektora zmian pola tekstowego, jak wspomniano tutaj .
źródło
była to zaktualizowana wersja Codemwnci. jego kod jest całkiem w porządku i działa świetnie, z wyjątkiem komunikatu o błędzie. Aby uniknąć błędu, musisz zmienić instrukcję warunku.
źródło
Do sterowania można użyć nawet „MouseExited”. przykład:
źródło
Jestem zupełnie nowy w WindowBuilder i tak naprawdę dopiero po kilku latach wracam do Javy, ale zaimplementowałem „coś”, a potem pomyślałem, że to sprawdzę i napotkałem ten wątek.
Jestem w trakcie testowania tego, więc biorąc pod uwagę to, że jestem nowy w tym wszystkim, jestem pewien, że czegoś mi brakuje.
Oto co zrobiłem, gdzie „runTxt” jest polem tekstowym, a „runName” jest członkiem danych klasy:
Wydaje się o wiele prostsze niż to, co jest tutaj do tej pory, i wydaje się, że działa, ale skoro jestem w trakcie pisania tego, doceniłbym usłyszenie o jakichkolwiek przeoczonych problemach. Czy to problem, że użytkownik może wprowadzić i pozostawić pole tekstowe bez wprowadzania zmian? Myślę, że wszystko, co zrobiłeś, to niepotrzebne zadanie.
źródło
Użyj KeyListener (który uruchamia się na dowolnym kluczu) zamiast ActionListener (który uruchamia się po wejściu)
źródło
field.getText()
zwraca wartość początkową. a event (arg0.getKeyChar()
) zwraca wciśnięty klawisz. Sprawdzanie błędów jest potrzebne do ustalenia, czy powinieneś połączyć tekst z polem.DocumentFilter ? Daje to możliwość manipulacji.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Przepraszam. Używam Jython (Python w Javie) - ale łatwy do zrozumienia
źródło