将Action与DocumentListener一起使用

时间:2011-09-07 01:02:42

标签: java swing action jtextcomponent documentlistener

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

我使用DocumentListener完成了第一部分,并将相关代码放在insertUpdate方法中。

之前我没有使用Action,但我听说它们适用于需要多个控件触发的情况。是否可以从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中其他位置设置的其他值;如果用户更改了这些其他值,他可能想要重新解析文本,因此需要通过按下按钮来执行相同的操作。

3 个答案:

答案 0 :(得分:4)

  

我希望用户可以通过更新JTextArea的内容来触发,或者通过按下JButton手动触发。

这对我没有意义。

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

  

之前我没有使用过动作,但我听说它们适用于需要多个控件触发的情况

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

DocumentListener不是ActionListener,因此我之前说过使用Action似乎不合适。

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

根据说明进行编辑

  

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

为什么用户可以选择?如果更改文本区域的字体,文本,前景,背景,自动重新绘制的组件,则无需执行此操作。如果查看这些方法的代码,它们总是最终调用revalidate()和repaint()方法。

  

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

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

答案 1 :(得分:3)

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

答案 2 :(得分: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()是一种方法,您可以在其中执行您想要做的事情。

相关问题