我正在开发一个应用程序,我希望用户可以通过更新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中其他位置设置的其他值;如果用户更改了这些其他值,他可能想要重新解析文本,因此需要通过按下按钮来执行相同的操作。
答案 0 :(得分:4)
我希望用户可以通过更新JTextArea的内容来触发,或者通过按下JButton手动触发。
这对我没有意义。
为什么单击按钮会调用与用户在文本区域中键入文本相同的操作?
之前我没有使用过动作,但我听说它们适用于需要多个控件触发的情况
该语句适用于用户单击的控件,如JMenuItems,JButtons或在文本字段上按Enter键。通常,在使用ActionListner时可以使用它们。
DocumentListener不是ActionListener,因此我之前说过使用Action似乎不合适。
我认为你需要澄清你的要求。
根据说明进行编辑
如果用户更改了这些其他值,他可能想要重新解析文本
为什么用户可以选择?如果更改文本区域的字体,文本,前景,背景,自动重新绘制的组件,则无需执行此操作。如果查看这些方法的代码,它们总是最终调用revalidate()和repaint()方法。
解析依赖于GUI中其他位置设置的其他值;
听起来你需要一个自定义类。也许是ParsedTextArea或ParsedDocument。该类将包含可在GUI中的其他位置设置的“属性”。它会影响DocumentListener。它也会支持你的“parseTheText”方法。因此,每当更改属性或生成DocumentEvent时,您都会自动调用“parseTheText”方法。这样您就不需要单独的按钮,组件将始终保持同步,因为解析是自动的。
答案 1 :(得分:3)
答案 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()
是一种方法,您可以在其中执行您想要做的事情。