Использование действий с DocumentListener
Я разрабатываю приложение, где я хочу, чтобы что-то запускалось как пользователем, обновляющим содержимое JTextArea, так и вручную с помощью нажатия кнопки JButton.
Я сделал первую часть, используя DocumentListener и помещая соответствующий код в его insertUpdate
метод.
Я не использовал Action
S раньше, но я слышал, что они полезны для ситуаций, когда вам нужно что-то запускать с помощью нескольких элементов управления. Можно ли вызвать действие из в DocumentListener? Это хорошая идея использовать действия вообще, или я должен просто поместить свой код в обычный метод?
(в конструкторе):
textAreaInput.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
// do something
}
public void removeUpdate(DocumentEvent e) {}
public void changedUpdate(DocumentEvent e) {}
});
и действие, которое является полем:
Action doSomething = new AbstractAction("Do Something!") {
@Override
public void actionPerformed(ActionEvent e) {
// do it
}
};
пояснение:
JTextArea получит текст, вставленный пользователем, который я хочу проанализировать автоматически. Синтаксический анализ зависит от других значений, установленных в другом месте GUI; если пользователь изменяет эти другие значения, он может хотите повторно разобрать текст, значит нужно выполнить то же самое действие нажатием кнопки.
3 ответов
Я хочу, чтобы что-то запускалось как пользователем, обновляющим содержимое JTextArea, так и вручную, нажав кнопку JButton.
Это не имеет смысла для меня.
почему нажатие кнопки вызывает то же действие, что и ввод текста Пользователем в текстовую область?
Я не использовал действия раньше, но я слышал, что они полезны для ситуаций, когда вам нужно что-то запускать несколькими управление
этот оператор предназначен для элементов управления, которые пользователь щелкает, например JMenuItems, JButtons или нажатие Enter в текстовом поле. В целом они могут использоваться при использовании ActionListner.
DocumentListener не является ActionListener, поэтому, как я уже говорил ранее, использование действия не кажется уместным.
Я думаю, вам нужно уточнить ваши требования.
Edit, основанный на разъяснении
если пользователь изменяет эти другие значения, он может захотеть повторно разобрать текст
почему у пользователя есть выбор? Если вы измените шрифт, текст, передний план, фон текстовой области, компонент, который он автоматически перекрашивает, вам не нужно просить, чтобы это было сделано. Если вы посмотрите на код для этих методов, они всегда в конечном итоге вызывают методы revalidate() и repaint ().
синтаксический анализ зависит от других значений, установленных в другом месте Графический интерфейс;
похоже, вам нужен пользовательский класс. Может быть, ParsedTextArea или ParsedDocument. Этот класс будет содержать "свойства", которые могут быть установлены в другом месте в GUI. Это implmenent в DocumentListener. Он также поддерживает ваш метод" parseTheText". Поэтому, когда свойство изменяется или создается DocumentEvent, вы автоматически вызываете метод "parseTheText". Таким образом, вам не нужна отдельная кнопка и компонент всегда будут синхронизированы, потому что разбор выполняется автоматически.
Я думаю, вам не нужно создавать объект действия. Вы можете добавить ActionListener к кнопке так же, как вы добавили DocumentListener в документ ввода. Если я правильно понимаю вашу проблему, возможно, вы должны сделать что-то вроде этого:
textInput.getDocument().addDocumentListener(new DocumentListener(){
@Override
public void insertUpdate(DocumentEvent e) {
doIt();
}
@Override
public void removeUpdate(DocumentEvent e) {}
@Override
public void changedUpdate(DocumentEvent e) {}
});
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
doIt();
}
});
doIt()
является способ, в котором вы будете делать то, что вы хотели сделать.