Код: Выделить всё
JFormattedTextFieldКак мне (должно) заставить поле отражать свое значение сразу после его установки (даже если поле все еще удерживает фокус)?
Код: Выделить всё
repaint()Правда, я могу установить текст вручную, но это вызывает ненужный вызов stringToValue(), по сути, вычисляя одно и то же значение заново. Это неприемлемо.
Java 8.
Код: Выделить всё
import javax.swing.JFormattedTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.text.DefaultFormatter;
import javax.swing.text.DefaultFormatterFactory;
import java.awt.Component;
import java.awt.Container;
public class FormattedTextFieldDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Formatted Text Field Demo");
frame.setContentPane(createMainPanel());
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static Container createMainPanel() {
JPanel panel = new JPanel();
panel.add(createTextField());
return panel;
}
private static Component createTextField() {
JFormattedTextField field = new JFormattedTextField();
field.setColumns(10);
field.setFormatterFactory(createFormatterFactory());
field.addPropertyChangeListener("value", e -> {
// field.repaint(); // useless
// field.setText(toString((Person) e.getNewValue())); // works but triggers superfluous value computation
System.out.printf("Value changed. New value: %s\n", e.getNewValue());
});
return field;
}
private static AbstractFormatterFactory createFormatterFactory() {
DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory();
formatterFactory.setDefaultFormatter(createFormatter());
return formatterFactory;
}
private static AbstractFormatter createFormatter() {
AbstractFormatter formatter = new DefaultFormatter() {
@Override
public Object stringToValue(String string) {
return (string == null) ? null : new Person(string);
}
@Override
public String valueToString(Object value) {
return (value instanceof Person) ? FormattedTextFieldDemo.toString((Person) value) : null;
}
};
return formatter;
}
private static String toString(Person value) {
if (value == null) return null;
return String.format("Person %s", value.getName());
}
}
Код: Выделить всё
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person " + name;
}
}
Код: Выделить всё
Value changed. New value: null
Value changed. New value: Person Alex

Подробнее здесь: https://stackoverflow.com/questions/798 ... -new-value
Мобильная версия