听取粘贴事件JTextArea

时间:2014-08-13 00:02:55

标签: java swing event-handling jtextarea paste

我想在用户在JTextArea中粘贴文本时调用函数。将文本粘贴到JTextArea时是否会生成任何事件?我可以使用哪个侦听器来触发此事件的函数?

3 个答案:

答案 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}}方法,这相当于大约相同的东西,但是,第一个选项会更便携......

作为一个想法...

请查看How to Use ActionsHow to Use Key Bindings了解详情

答案 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。