java swing JTextPane 按键、长按、回车键等控制

王老师让我帮他做个小软件,大概的需求是:他儿子正在背写圆周率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);
        }
    }

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2246792/blog/678953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值