0

当按下 CTRL+C 时,我正在尝试将某个字符串打印到 JEditorPane 中的当前插入符号位置。我不确定如何处理两个关键事件并打印到当前插入符号位置。API 不能很好地描述它们。我想它会是这样的:

@Override 
public void keyPressed( KeyEvent e) {
    if((e.getKeyChar()==KeyEvent.VK_CONTROL) && (e.getKeyChar()==KeyEvent.VK_C))
        //JEditorPane.getCaretPosition();
        //BufferedWriter bw = new BufferedWriter();
        //JEditorPane.write(bw.write("desired string"));
}

有人可以告诉我这是否可行吗?

4

1 回答 1

4

该事件的 keyChar 永远不会同时等于 VK_CONTROL 和 VK_C。您要做的是检查 CONTROL 键作为事件的修饰符。如果您想在编辑器窗格中插入或附加文本,最好抓住包含文本的基础 Document 对象,然后将文本插入其中。如果您知道此上下文中的关键事件只能来自您的编辑器窗格,您可以执行以下操作:

if (e.getKeyCode() == KeyEvent.VK_C &&
       (e.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) {
    JEditorPane editorPane = (JEditorPane) e.getComponent();
    int caretPos = editorPane.getCaretPosition();
    try {
        editorPane.getDocument().insertString(caretPos, "desired string", null);
    } catch(BadLocationException ex) {
        ex.printStackTrace();
    }
}

这是一个完整的例子:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.text.BadLocationException;

public class EditorPaneEx {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    JEditorPane editorPane = new JEditorPane();
    editorPane.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent ev) {
            if (ev.getKeyCode() == KeyEvent.VK_C
                    && (ev.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) {
                JEditorPane editorPane = (JEditorPane) ev.getComponent();
                int caretPos = editorPane.getCaretPosition();
                try {
                    editorPane.getDocument().insertString(caretPos,
                            "desired string", null);
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
        }
    });
    frame.add(editorPane);
    frame.pack();
    frame.setVisible(true);
}

}

于 2012-07-16T16:40:04.113 回答