Mam problem z zrealizowaniem prostego uzupełniania wprowadzonego tekstu w JTextField o dodatkowe znaki. A dokładnie chodzi o to że użytkownik wpisuje tekst do pola JTextField np. date w postaci RRRRMMDD a program automatycznie w trakcie wprowadzania rozdziela rok, miesiąc, dzień znakiem "-".
Chciałem to wykonać w oparciu o DocumentListener który by sprawdzał ile jest wprowadzonych znaków w przypadku gdy jest ich już 4 to dopisuje do pola "-" użytkownik pisze dalej gdy string osiągnie długość 7 dopisuje kolejny "-" a na końcu użytkownik dopisuje jedynie dzień. Efekt końcowy => 2010-06-03.
A to fragment kodu który miał to robić
.
.
tekst = new JTextField(20);
panel.add(tekst);
tekst.getDocument().addDocumentListener(new kontrolaPola(tekst));
.
.
class kontrolaPola implements DocumentListener {
public kontrolaPola(JTextField komp) {
komponent = komp;
}
public void changedUpdate(DocumentEvent arg0) {
}
public void insertUpdate(DocumentEvent arg0) {
if (komponent.getText().length() == 4) {
komponent.setText(komponent.getText() + "-");
}
if (komponent.getText().length() == 7) {
komponent.setText(komponent.getText() + "-");
}
}
public void removeUpdate(DocumentEvent arg0) {
}
private JTextField komponent;
}
Jednak efektem jego działania jest błąd:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
Macie może jakiś pomysł jak mogę usunąć przyczynę błędu ewentualnie wykonać co chciałem inna metodą.
**************************************************************************
Znalazłem rozwiązanie jednak do końca nie rozumiem jak ono działa dla zainteresowanych problemem zmodyfikowany kod poniżej.
class kontrolaPola implements DocumentListener {
public kontrolaPola(JTextField komp) {
komponent = komp;
}
public void changedUpdate(DocumentEvent arg0) {
}
public void insertUpdate(DocumentEvent arg0) {
Runnable r = new Runnable() {
public void run() {
if (komponent.getText().length() == 4) {
komponent.setText(komponent.getText() + "-");
}
if (komponent.getText().length() == 7) {
komponent.setText(komponent.getText() + "-");
}
}
};
SwingUtilities.invokeLater(r);
}
public void removeUpdate(DocumentEvent arg0) {
}
private JTextField komponent;
}