王老师让我帮他做个小软件,大概的需求是:他儿子正在背写圆周率1000位,需要有个软件即时匹配 或 结束匹配,输入的数字是否正确。设计规则是:只允许输入数字,点,删除键,长按键盘上某键时只输入1个字符。这里仅分享一下JTextPane的控制吧,关键是键盘事件那块最复杂。
少说废话,直接贴上代码:
public class MemTest extends JFrame {
JTextPane textPane = null;
textPane = new JTextPane();
textPane.setFont(new Font("微软雅黑", Var.isBold?Font.BOLD:Font.PLAIN, Var.fontSize));
textPane.addKeyListener(new TxtPaneKeyAdapter());
/**
* @ClassName: TxtPaneKeyAdapter
* @Description: 当在textpane中按下键时,判断字符是否匹配 ,以不同色彩输出
* @author 张慧健
* @date 2016-5-8 上午9:34:58
*
*/
class TxtPaneKeyAdapter extends KeyAdapter {
long lastTypedTime = 0;
long currTypedTime = 0;
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("keyPressed");
//当回车键、tab键时,取消
if(e.getKeyChar() == KeyEvent.VK_ENTER || e.getKeyChar() == KeyEvent.VK_TAB){
e.consume();
}
}
@Override
public void keyTyped(KeyEvent e) {
// System.out.println(" keyTyped");
//只允许几个键:0-9 . 退格键
if ((e.getKeyChar()>=KeyEvent.VK_0 && e.getKeyChar()<=KeyEvent.VK_9) ||
e.getKeyChar() == KeyEvent.VK_BACK_SPACE ||
e.getKeyChar() == KeyEvent.VK_PERIOD) {
} else {
e.consume();
}
//判断上次keyTyped的时间与本次keyTyped的时间比较,小的话则扔掉
if(lastTypedTime == 0){
lastTypedTime = System.currentTimeMillis();
}else{
lastTypedTime = currTypedTime;
}
currTypedTime = System.currentTimeMillis();
// System.out.println(currTypedTime+" "+ lastTypedTime);
if(currTypedTime-lastTypedTime > 0){//只对第一次生效,第二次以后的两个时间差>0则取消
e.consume();
}
}
@Override
public void keyReleased(KeyEvent e) {
lastTypedTime = 0;
currTypedTime = 0;
// System.out.println(" keyReleased");
int caretPosition = textPane.getCaretPosition(); //光标位置
int pos = (caretPosition-1)<0?0:caretPosition-1;
//退格键时
if(e.getKeyChar() == KeyEvent.VK_BACK_SPACE){
if(inputNum>0) inputNum--;
System.out.println(inputNum);
}
StyleConstants.setFontSize(set, Var.fontSize);// 设置字体大小
StyleConstants.setBold(set, Var.isBold);
//只有字母与数字才匹配处理
if((e.getKeyChar()>=KeyEvent.VK_0 && e.getKeyChar()<=KeyEvent.VK_9) ||
e.getKeyChar() == KeyEvent.VK_PERIOD){
inputNum++;
StyledDocument doc = textPane.getStyledDocument(); //获取doc对象
if(Var.instantCheck){ //即时检查
char inputChar = e.getKeyChar();
char srcChar = '?';
if(srcs.length>=caretPosition){
srcChar = srcs[pos];
}
System.out.println("位置:"+pos+" 源:"+srcChar +" 按:"+inputChar);
if(inputChar == srcChar){
StyleConstants.setForeground(set, Var.rightColor);
doc.setCharacterAttributes(pos, 1, set, true);
}else{
StyleConstants.setForeground(set, Var.wrongColor);
doc.setCharacterAttributes(pos, 1, set, true);
}
}else {
StyleConstants.setForeground(set, Color.BLACK);
doc.setCharacterAttributes(pos, 1, set, true);
}
}
//显示输入统计信息
showInputStatInfo(inputNum);
}
}