3-2使用链表的记事本

来源:互联网 发布:天津滨海网络广播电视 编辑:程序博客网 时间:2024/06/05 14:51

        坚持练习20遍固然是艰难的,但是,没有天生的本领,就需要后天的努力!

        今天继续把链表做的记事本贴出来,还是记录一下自己的学习之路,再次感谢王洋老师的java就该这样学~


import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class test3_2 {
    public static void main(String[] args) {
        //窗体
        JFrame w = new JFrame();
        w.setSize(300,400);
        
        //添加画布
        MyPanel2 mp = new MyPanel2();
        w.add(mp);
        
        //添加键盘监听事件
        w.addKeyListener(mp);
        mp.addKeyListener(mp);
        
        //可关闭
        w.setVisible(true);
    }
}
/*
 * 1、需要定义跨越paint和键盘事件处理方法的变量,也就是第一个节点
 * 2、在paint中 显示所有的变量
 * 3、在键盘事件处理方法中加入新的节点
 */
class MyPanel2 extends Panel implements KeyListener{
    //定义第一个节点
    Node firstNode = new Node();
    //当前节点
    Node nowNode = firstNode;
    //光标位置标量
    int cursor = 0;
    
    public void paint(Graphics g){
        super.paint(g);//清空屏幕
        
        //遍历每一个节点
        //声明的临时变量是Node类型的,这样才能够指向每个节点
        Node tmpNode = firstNode;
        int x = 0;//需要调整x的坐标
        while(tmpNode.next!=null){//最后一个节点是null
            g.drawString(""+tmpNode.next.value, 10+8*x, 10);
            x++;
            //让tmpNOde在链表中向下移动
            tmpNode = tmpNode.next;
        }
        
        //光标
        g.drawLine(cursor*8+10, 0, cursor*8+10, 10);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        //输入字符
        if(e.getKeyCode()>=KeyEvent.VK_A && e.getKeyCode()<=KeyEvent.VK_Z){
            if(nowNode.next==null){//光标在最后一个节点位置
                Node newNode = new Node();
                newNode.value = e.getKeyChar();
                nowNode.next = newNode;
                //将当前节点移动到新节点上,因为现在新节点已经是当前节点了。
                nowNode = newNode;
                //光标位置
                cursor++;
            }else{
                //创建新节点
                Node newNode = new Node();
                //赋值
                newNode.value = e.getKeyChar();
                //让新节点的next指向下一个节点
                newNode.next = nowNode.next;
                //让当前节点的next指向新节点
                nowNode.next = newNode;
                //维护nowNode和光标
                nowNode = newNode;
                cursor++;
            }
            
        }
        //按左键
        if(e.getKeyCode()==KeyEvent.VK_LEFT){
            if(cursor>0){
                cursor--;
                //从第一个节点开始,找到当前节点的前一个节点
                Node tmpNode = firstNode;
                while(tmpNode.next!=nowNode){
                    tmpNode = tmpNode.next;
                }
                nowNode = tmpNode;//修改当前的节点
            }
        }
        //按右键
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            if(nowNode.next!=null){
                cursor++;
                nowNode = nowNode.next;
            }
        }
        //按Backspace
        if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
            if(cursor>0){
                //从第一个节点开始,找到当前节点的前一个节点
                Node tmpNode = firstNode;
                while(tmpNode.next!=nowNode){
                    tmpNode = tmpNode.next;
                }
                nowNode = tmpNode;//修改当前的节点
                //删除当前节点
                nowNode.next = nowNode.next.next;
                cursor--;
            }
        }
        //按delete
        if(e.getKeyCode()==KeyEvent.VK_DELETE){
            if(nowNode.next!=null){
                //删除当前节点
                nowNode.next = nowNode.next.next;
            }
        }
        //重画
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
}
//节点类
class Node{
    public char value = ' ';
    public Node next = null;
}


这个是一个逻辑能力的训练,有些功能不太完善,希望大家不要喷我,毕竟菜鸟一只。谢谢了~