问题:
在Swing的JTextArea中,我们敲回车键是换行。现在我想用Ctrl+Enter来替代,不知道这个事件应如何处理??我已经可以判断出Ctrl+Enter同时按下的情况了,但是不知道如何达到原来只按Enter的效果。对于原来的Enter键,现在的功能是想让它移到下一个控件上。
解决:
写一个继承于JTextArea的类,同时实现几种方法即刻。或是在我们自己的类中,加入如下的方法。
import hoksoftbuhin.HTextArea;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.Hashtable;
import javax.swing.Action;
import javax.swing.KeyStroke;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;
/*
* Created on 2004-8-13
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
/**
* @author Administrator
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class TestArea extends HTextArea {
private Hashtable actionTable = new Hashtable();
public TestArea() {
super();
loadActionTable();
setKeymap(createKeymap());
}
/**
* 在Keymap中,增加对Ctrl+Enter同时按下的处理。
* @return
*/
private Keymap createKeymap() {
Keymap map =
JTextComponent.addKeymap("applet keymap", getKeymap());
KeyStroke returnKeyStroke =
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.CTRL_MASK);
Action returnAction = getAction(DefaultEditorKit.insertBreakAction);
map.addActionForKeyStroke(returnKeyStroke, returnAction);
return map;
}
/**
* 获得原先动作的一个集合
*
*/
private void loadActionTable() {
Action[] actions = getActions();
for (int i = 0; i < actions.length; ++i) {
actionTable.put(actions[i].getValue(Action.NAME), actions[i]);
}
}
/**
* 根据名字,来获得相应的Action
* @param name
* @return
*/
private Action getAction(String name) {
return (Action) actionTable.get(name);
}
}
以上代码实现了Ctrl+Enter换行的功能。
=============================
至于屏蔽原先的Enter的功能,现在是用别的方法来替代了,没有找到真正能Remove掉该方法。
扩充一下createKeymap()方法。
private Keymap createKeymap() {
Keymap map =
JTextComponent.addKeymap("applet keymap", getKeymap());
KeyStroke returnKeyStroke =
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.CTRL_MASK);
Action returnAction = getAction(DefaultEditorKit.insertBreakAction);
map.addActionForKeyStroke(returnKeyStroke, returnAction);
KeyStroke returnKeyStroke2 =
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0);
Action returnAction2 = getAction(DefaultEditorKit.endWordAction);
map.addActionForKeyStroke(returnKeyStroke2, returnAction2);
return map;
}
这样即刻取消掉原先的换行,但并没有从根本得到解决。