Я хочу, чтобы окно сообщения появилось сразу после того, как пользователь изменил значение в текстовом поле. В настоящее время мне нужно нажать клавишу ввода, чтобы выскочило окно сообщения. Что-то не так с моим кодом?
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);
}
}
}
Любая помощь будет оценена!
java
swing
listener
jtextfield
documentlistener
user236501
источник
источник
Обычный ответ на это «использовать
DocumentListener
». Тем не менее, я всегда нахожу этот интерфейс громоздким. По правде говоря, интерфейс перегружен. Он имеет три метода для вставки, удаления и замены текста, когда ему нужен только один метод: замена. (Вставка может рассматриваться как замена текста без текста, а удаление может рассматриваться как замена текста без текста.)Обычно все, что вам нужно, это знать, когда текст в поле изменился , поэтому типичная
DocumentListener
реализация имеет три метода, вызывающих один метод.Поэтому я сделал следующий метод утилит, который позволяет вам использовать более простой
ChangeListener
, чемDocumentListener
. (Он использует лямбда-синтаксис Java 8, но при необходимости вы можете адаптировать его для старой Java.)В отличие от добавления слушателя непосредственно в документ, это обрабатывает (необычный) случай, когда вы устанавливаете новый объект документа в текстовом компоненте. Кроме того, он работает вокруг проблемы, упомянутой в ответе Жана-Марка Астесана , где документ иногда запускает больше событий, чем нужно.
В любом случае, этот метод позволяет заменить раздражающий код, который выглядит следующим образом:
С участием:
Код опубликован в открытом доступе. Радоваться, веселиться!
источник
abstract class DocumentChangeListener implements DocumentListener
дополнительный абстрактный метод,change(DocumentEvent e)
который вы вызываете из всех трех других методов. Мне кажется более очевидным, поскольку он использует более или менее ту же логику, что иabstract *Adapter
слушатели.changedUpdate
метод должен быть вызван явно через вызов внутри каждого из,insertUpdate
иremoveUpdate
, чтобы заставить его работать ..Просто создайте интерфейс, который расширяет DocumentListener и реализует все методы DocumentListener:
а потом:
или вы можете даже использовать лямбда-выражение:
источник
Помните, что когда пользователь изменяет поле, DocumentListener может иногда получать два события. Например, если пользователь выбирает содержимое всего поля, а затем нажимает клавишу, вы получите removeUpdate (все содержимое удаляется) и insertUpdate. В вашем случае, я не думаю, что это проблема, но, вообще говоря, это так. К сожалению, кажется, что нет способа отследить содержимое textField без подкласса JTextField. Вот код класса, который предоставляет свойство «текст»:
источник
Я знаю, что это связано с действительно старой проблемой, однако, это вызвало и у меня некоторые проблемы. Как Клеопатра ответил в комментарии выше, я решил проблему с
JFormattedTextField
. Однако решение требует немного больше работы, но аккуратнее.JFormattedTextField
Не триггер по умолчанию изменения свойств после каждого изменения текста в поле. Конструктор по умолчаниюJFormattedTextField
не создает средство форматирования.Однако, чтобы сделать то, что предложил OP, вам нужно использовать средство форматирования, которое будет вызывать
commitEdit()
метод после каждого действительного редактирования поля.commitEdit()
Метод , что вызывает изменение свойств от того, что я могу увидеть и без форматере, это срабатывает по умолчанию на изменении фокуса или когда клавиша ввода нажата.См. Http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value для получения дополнительной информации.
Создайте объект formatter (
DefaultFormatter
) по умолчанию, который будет переданJFormattedTextField
либо через его конструктор, либо через метод установки. Одним из методов стандартного форматирования являетсяsetCommitsOnValidEdit(boolean commit)
установка форматера для запускаcommitEdit()
метода при каждом изменении текста. Это может затем быть подобрано с помощьюPropertyChangeListener
и наpropertyChange()
методе.источник
Но я бы не просто разбирал все, что пользователь (может быть, случайно) касается своей клавиатуры, в
Integer
. Вы должны поймать любойException
s брошенный и убедиться, чтоJTextField
он не пуст.источник
Если мы используем метод runnable SwingUtilities.invokeLater () при использовании приложения прослушивания документов, иногда оно застревает и требует времени для обновления результата (согласно моему эксперименту). Вместо этого мы также можем использовать событие KeyReleased для прослушивателя изменения текстового поля, как упомянуто здесь .
источник
это была обновленная версия Codemwnci. его код довольно хорошо и отлично работает, за исключением сообщения об ошибке. Чтобы избежать ошибки, вы должны изменить условие условия.
источник
Вы можете использовать даже «MouseExited» для контроля. пример:
источник
Я новичок в WindowBuilder и, на самом деле, просто возвращаюсь в Java через несколько лет, но я реализовал «кое-что», а потом подумал, что найду его и наткнулся на эту тему.
Я нахожусь в процессе тестирования, так что, будучи новичком во всем этом, я уверен, что что-то упустил.
Вот что я сделал, где «runTxt» - это текстовое поле, а «runName» - член данных класса:
Кажется, намного проще, чем то, что здесь до сих пор, и, кажется, работает, но, поскольку я нахожусь в процессе написания этого, я был бы рад услышать о любых пропущенных ошибках. Является ли проблемой то, что пользователь мог ввести и оставить текстовое поле без внесения изменений? Я думаю, что все, что вы сделали, это ненужное задание.
источник
Используйте KeyListener (который срабатывает на любую клавишу), а не ActionListener (который срабатывает при вводе)
источник
field.getText()
возвращает начальное значение. и событие (arg0.getKeyChar()
) возвращает нажатие клавиши. Проверка ошибок необходима, чтобы определить, следует ли объединять текст поля.DocumentFilter ? Это дает вам возможность манипулировать.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Сожалею. Я использую Jython (Python в Java) - но легко понять
источник