Использование действий с DocumentListener - PullRequest
7 голосов
/ 07 сентября 2011

Я разрабатываю приложение, в котором я хочу, чтобы что-то запускалось как пользователем, обновляющим содержимое JTextArea, так и вручную, нажав JButton.

Я выполнил первую часть, используя DocumentListener и поместив соответствующий код в метод insertUpdate.

Я раньше не использовал Action с, но я слышал, что они полезны в ситуациях, когда вам нужно, чтобы что-то было запущено несколькими элементами управления. Можно ли вызвать действие из 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 ]

4 голосов
/ 07 сентября 2011

Я хочу, чтобы что-то было запущено как пользователем, обновляющим содержимое JTextArea, так и вручную, нажав JButton.

Это не имеет смысла для меня.

Почему при нажатии кнопки вызывается то же действие, что и при вводе текста пользователем в текстовую область?

Я раньше не использовал действия, но слышал, что они полезны для ситуаций.где вам нужно, чтобы что-то вызывалось несколькими элементами управления

Этот оператор предназначен для элементов управления, которые пользователь нажимает, например, JMenuItems, JButtons или нажатие клавиши Enter в текстовом поле.Обычно их можно использовать при использовании ActionListner.

DocumentListener не является ActionListener, поэтому, как я уже говорил ранее, использование Action не представляется целесообразным.

Я думаю, что вам нужночтобы уточнить ваши требования.

Редактировать, основываясь на разъяснениях

Если пользователь изменит эти другие значения, он может захотеть повторно проанализировать текст

Почему у пользователя есть выбор?Если вы измените шрифт, текст, передний план, фон текстовой области, компонент, который она автоматически перерисовывает, вам не нужно просить об этом.Если вы посмотрите на код этих методов, они всегда будут вызывать методы revalidate () и repaint ().

Разбор зависит от других значений, установленных в другом месте графического интерфейса;

Звучит так, будто вам нужен собственный класс.Может быть, ParsedTextArea или ParsedDocument.Этот класс будет содержать «свойства», которые можно установить в другом месте графического интерфейса.Это было бы важно для DocumentListener.Это также поддержит ваш метод "parseTheText".Таким образом, всякий раз, когда свойство изменяется или генерируется DocumentEvent, вы автоматически вызываете метод "parseTheText".Таким образом, вам не нужна отдельная кнопка, и компонент всегда будет синхронизирован, потому что анализ выполняется автоматически.

3 голосов
/ 07 сентября 2011

Вы можете вызвать метод actionPerformed(), независимо от того, используется он в Action или нет. Вот пример здесь .

2 голосов
/ 07 сентября 2011

Я думаю, вам не нужно создавать объект Action.Вы можете добавить 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() - это метод, в котором вы будете делать то, что хотели.

...