DefaultFormatter вызывает функцию stringToValue(), даже если текстовое значение (еще) не зафиксировано, то есть для каждого типа ключа.
Если функция дорогая, например включает в себя некоторый ввод-вывод, он может быть неоптимальным. Например, в нашем случае пользователь может ввести код МКБ-10, нажать Enter, и соответствующий объект заболевания, если он есть, будет извлечен из БД и установлен в качестве значения поля.
Можно ли этого избежать? Я хочу, чтобы любые попытки преобразования происходили только после того, как строка будет отправлена пользователем — при нажатии Enter. Я думаю, нам, вероятно, следует вернуться к потере фокуса с помощью setFocusLossBehavior(JFormattedTextField.REVERT).
Возможно, мне вообще не следует помещать логику сопоставления строк с объектами в метод stringToValue(), а вместо этого прослушивать изменения свойства «value» (которые отражают только зафиксированные изменения). Я думал примерно так: «Ну, если я включу сопоставление значений и строк в AbstractFormatter, мне, вероятно, следует поместить туда и противоположное сопоставление». В любом случае, какие части API мне следует переопределить и как, включая логику проверки? Я считаю, что мы можем предположить, что зафиксированное значение всегда можно сопоставить со строкой, но обратное не всегда верно. Примечание. valueToString() может выдать ParseException, что предполагает возможность проверки метода. Тогда это кажется необычным. Swing поощряет проверку всех промежуточных входных данных.
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 -> 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) {
System.out.println("Performing expensive operation...");
return (string == null) ? null : new Person(string);
}
};
return formatter;
}
}
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
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Подробнее здесь: https://stackoverflow.com/questions/798 ... ubmit-only
Сопоставление текста JFormattedTextField со значением только при отправке ⇐ JAVA
Программисты JAVA общаются здесь
1761750151
Anonymous
DefaultFormatter вызывает функцию stringToValue(), даже если текстовое значение (еще) не зафиксировано, то есть для каждого типа ключа.
Если функция дорогая, например включает в себя некоторый ввод-вывод, он может быть неоптимальным. Например, в нашем случае пользователь может ввести код МКБ-10, нажать Enter, и соответствующий объект заболевания, если он есть, будет извлечен из БД и установлен в качестве значения поля.
Можно ли этого избежать? Я хочу, чтобы любые попытки преобразования происходили только после того, как строка будет отправлена пользователем — при нажатии Enter. Я думаю, нам, вероятно, следует вернуться к потере фокуса с помощью setFocusLossBehavior(JFormattedTextField.REVERT).
Возможно, мне вообще не следует помещать логику сопоставления строк с объектами в метод stringToValue(), а вместо этого прослушивать изменения свойства «value» (которые отражают только зафиксированные изменения). Я думал примерно так: «Ну, если я включу сопоставление значений и строк в AbstractFormatter, мне, вероятно, следует поместить туда и противоположное сопоставление». В любом случае, какие части API мне следует переопределить и как, включая логику проверки? Я считаю, что мы можем предположить, что зафиксированное значение всегда можно сопоставить со строкой, но обратное не всегда верно. Примечание. valueToString() может выдать ParseException, что предполагает возможность проверки метода. Тогда это кажется необычным. Swing поощряет проверку всех промежуточных входных данных.
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 -> 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) {
System.out.println("Performing expensive operation...");
return (string == null) ? null : new Person(string);
}
};
return formatter;
}
}
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
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Performing expensive operation...
Подробнее здесь: [url]https://stackoverflow.com/questions/79803712/mapping-jformattedtextfield-text-to-value-on-submit-only[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия