我想在用户在JTextArea中粘贴文本时调用函数。将文本粘贴到JTextArea时是否会生成任何事件?我可以使用哪个侦听器来触发此事件的函数?
答案 0 :(得分:5)
一个可能的解决方案(我希望其中一个有更好的解决方案)将替换负责实际执行粘贴操作的键绑定Action
。
现在,在你这样做之前,默认的粘贴操作并不简单,相反,我会用代理替换默认的粘贴Action
,代理可以调用原始文件,但是允许你拦截操作,但不必自己重新实现功能,例如......
public class ProxyAction extends AbstractAction {
private Action action;
public ProxyAction(Action action) {
this.action = action;
}
@Override
public void actionPerformed(ActionEvent e) {
action.actionPerformed(e);
System.out.println("Paste Occured...");
}
}
然后您只需要查找默认的Action
并替换它......
JTextArea ta = new JTextArea(10, 10);
Action action = ta.getActionMap().get("paste-from-clipboard");
ta.getActionMap().put("paste-from-clipboard", new ProxyAction(action));
这里的问题是,这不会告诉您操作是否失败或成功或实际粘贴的是什么。为此,您可以使用在注册默认DocumentListener
之前注册的Action
,它可以记录对文档的更改。显然,您需要在默认操作后取消注册;)...
现在,同样地,你可以覆盖paste
的{{1}}方法,这相当于大约相同的东西,但是,第一个选项会更便携......
作为一个想法...
答案 1 :(得分:1)
你可以有类似下面的内容,每当你在textarea中粘贴一些东西,然后粘贴!'打印出来在你的控制台上。 仅在粘贴时打印!
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class TextAreaDemo extends JFrame {
JTextArea _resultArea = new JTextArea(6, 20);
public TextAreaDemo() {
_resultArea.setText("");
JScrollPane scrollingArea = new JScrollPane(_resultArea);
JPanel content = new JPanel();
content.setLayout(new BorderLayout());
content.add(scrollingArea, BorderLayout.CENTER);
this.setContentPane(content);
this.setTitle("TextAreaDemo B");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
_resultArea.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_V) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("Pasted!");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
public static void main(String[] args) {
JFrame win = new TextAreaDemo();
win.setVisible(true);
}
}
答案 2 :(得分:0)
您还可以查看Wrapping Actions,这与MadProgrammer的建议基本相同,只是WrapperAction
会将Action的所有方法委托给原始Action。这样您就可以选择与原始Action相关联的文本和图标,以防您想要将自定义Action添加到JMenuItem或JButton。