Обновление содержимого JFormattedTextField по новому значениюJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обновление содержимого JFormattedTextField по новому значению

Сообщение Anonymous »

Код: Выделить всё

JFormattedTextField
, что удивительно, не обновляет автоматически текстовое содержимое поля при фиксации значения — если только я не перефокусирую компонент (сфокусирую его на чем-то другом, а затем снова щелкну по полю). Можно было бы подумать, что есть слушатели OOB, которые уже это делают.
Как мне (должно) заставить поле отражать свое значение сразу после его установки (даже если поле все еще удерживает фокус)?

Код: Выделить всё

repaint()
, revalidate() в коде прослушивателя свойств не имеют никакого эффекта.
Правда, я могу установить текст вручную, но это вызывает ненужный вызов 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;
}
}
После ввода «Алекс» и нажатия Enter:

Код: Выделить всё

Value changed. New value: null
Value changed. New value: Person Alex
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... -new-value
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»