7

我正在开发一个应用程序,我希望通过用户更新 JTextArea 的内容或通过按下 JButton 手动触发某些东西。

我已经使用 DocumentListener 完成了第一部分并将相关代码放入其insertUpdate方法中。

我以前没有使用过Actions,但我听说它们对于需要由多个控件触发某些东西的情况很有用。是否可以从 DocumentListener 触发操作?完全使用 Actions 是一个好主意,还是应该将我的代码放在正常的方法中?

(在构造函数中):

    textAreaInput.getDocument().addDocumentListener(new DocumentListener() {
        public void insertUpdate(DocumentEvent e) {
            // do something
        }
        public void removeUpdate(DocumentEvent e) {}
        public void changedUpdate(DocumentEvent e) {}
    });

和 Action,它是一个字段:

Action doSomething = new AbstractAction("Do Something!") {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do it
    }
};

澄清:

JTextArea 将接收用户粘贴的文本,我想自动解析这些文本。解析依赖于 GUI 中其他地方设置的其他值;如果用户更改了这些其他值,他可能想要重新解析文本,因此需要通过按下按钮来执行相同的操作。

4

3 回答 3

4

我希望用户更新 JTextArea 的内容或通过按下 JButton 手动触发某些东西。

这对我来说没有意义。

为什么单击按钮会调用与用户在文本区域中输入文本相同的操作?

我以前没有使用过动作,但我听说它们对于需要由多个控件触发某些东西的情况很有用

该语句适用于用户单击的控件,例如 JMenuItems、JButtons 或在文本字段上按 Enter。通常,当您使用 ActionListner 时可以使用它们。

DocumentListener 不是 ActionListener,所以正如我之前所说,使用 Action 似乎不合适。

我认为你需要澄清你的要求。

编辑,基于澄清

如果用户更改了这些其他值,他可能想要重新解析文本

为什么用户有选择权?如果您更改文本区域的字体、文本、前景、背景、自动重绘的组件,您不必要求这样做。如果您查看这些方法的代码,它们总是最终会调用 revalidate() 和 repaint() 方法。

解析依赖于 GUI 中其他地方设置的其他值;

听起来你需要一个自定义类。也许是 ParsedTextArea 或 ParsedDocument。此类将包含可以在 GUI 的其他地方设置的“属性”。它将实现 DocumentListener。它还将支持您的“parseTheText”方法。因此,每当更改属性或生成 DocumentEvent 时,您都会自动调用“parseTheText”方法。这样您就不需要单独的按钮,并且组件将始终保持同步,因为解析是自动的。

于 2011-09-07T01:22:33.413 回答
3

您可以调用该actionPerformed()方法,无论它是否在 an 中Action这里有一个例子。

于 2011-09-07T01:13:57.790 回答
2

我认为您不需要创建 Action 对象。您可以将ActionListener添加到 Button ,就像您将 DocumentListener 添加到输入的 Document 一样。如果我正确理解您的问题,您可能应该这样做:

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()是一种让你做你想做的事的方法。

于 2011-09-07T03:17:21.117 回答