部落考核一--记事本(swing版)

本文档记录了一个使用Java Swing开发的记事本项目,包括项目结构、主要类的功能介绍以及在开发过程中遇到的问题和解决方案。项目未实现区分大小写功能,存在文件保存判断不足等问题,但整体功能基本实现,且经过调试无明显错误。通过该项目,作者提升了编程技能,学习了Swing组件和文件操作,并从IDEA切换到Eclipse。
补以下本该两个星期前发的考核心得

在此感谢书行师兄和泽涛师兄等各位师兄师姐的大力支持

Github项目地址

项目说明文档

程序包含1个包,5个类:
Main,Main方法所在类,用于执行程序运行;
jFrame,程序大体框架和总调用组件添加函数
jMenuBar,生成各种子选项JMenuItem并写入总组件调用方法,代码末尾并添加事件监听
JMenuItemActionListener,各组件的事件监听,响应事件并分配到FileService类里头执行最后方法调用
FileService,用于存储各种事件调用的最终方法,为了方便不出错误new出的jTextArea放在此类
打开方式:打开项目,运行Main方法即可

由于本机机子不知有什么毛病,可能会出现组件无法正常运行出现
此时只需最小化窗口,再打开即可恢复正常。

本次考核项目优缺点:

先说说没实现的功能:区分大小写 这个难以与本项目的indexOf搭配实现

缺点:
1、新建项目直接暴力清空文本框,没有判定是否保存当前文本
2、保存功能没有设置判断是否路径是否直接保存,基本完全就等于 另存为 。
3、退出和关闭窗口没有是否文本框变动判定
4、字体没有设置初始化大小,没有加滚动条(主要是因为个人原因,时间比较紧,事多。。。很多简单的功能没时间调试实现)
5、查找和替换两个功能函数分重写了框,都在FileService的类里,所以FileService 的代码过半都是这两个函数。。。
6、分了类却没分包,很多细节不规范

优点:
1、其他功能缺点没提到的都基本正常,跟正常的记事本相差无几;
2、经过多轮调试没发现有报错。

备注:
1、输出到编译器控制台的是我当初用来检查功能顺便debug的。
2、个人用的IDEA写的

项目总结文档

项目包含1个包,5个类:
Main,Main方法所在类,用于执行程序运行;
jFrame,程序大体框架和总调用组件添加函数
jMenuBar,生成各种子选项JMenuItem并写入总组件调用方法,代码末尾并添加事件监听
JMenuItemActionListener,各组件的事件监听,响应事件并分配到FileService类里头执行最后方法调用
FileService,用于存储各种事件调用的最终方法,为了方便不出错误new出的jTextArea放在此类

设计思路:
类之间建立必要的继承关系,从而维持各类之间方法调用。
以下为各类之间的依次继承关系,即FileService为最老的父类。
在这里插入图片描述

过程中遇到的问题以及解决:
整个项目完全处于半学半写状态,学到啥就往自己项目加点啥。
首先一开始就是很挫折的swing组件完全没接触过完全什么都一步步慢慢开始学,上个学期自己啃过的I/O快忘光了也只能从头拾起。从问师兄借课本学swing(我们这版课本讲的是javaFX)到b站找资源学组件怎么用,到csdn看别人的博客归类swing还有哪些组件和分布各种等等,再到上博客园、csdn等看别人怎么写的初步框架,然后到上github爬别人的项目(发现不是乱码看不了就是完全看不懂还有些自己写协议的大佬)
其次,输入输出文件时的编码问题,请教了下书行师兄搜了搜博客得以解决。
再,书行师兄指出我类分得不好,并给了我应如何分类的建议。
最后,折腾了我一个多星期的对象问题。一开始因为new的姿势不太对,导致文本框除了键盘输入其他功能完全无法正常使用,泽涛师兄帮我看了看指出了我的坑,然后自己捣鼓了一两天。原本是这样的继承这样的new

在这里插入图片描述

后来自己调试才变成上面的继承(捂脸,这方案我也很想吐槽但实在想不出别的)

回答问题:
1、对这份考核作业的评价,如个人觉得实现这份考核作业的难易程度、预计实现耗时、对自己的打击程度,帮助程度以及是否有提升作用等

考核评价:萌新不敢说难易,但给我记事本和计算器里挑我肯定挑计算器(简单太多了吧…)
预计耗时:三周 实际耗时:折合三周上下
打击程度:还阔以
帮助程度:很有帮助,个人感觉这半个月是真的学到了不少,与大佬的。
是否有提升:有,个人感觉水平提升。顺便从eclipse跳槽到了IDEA,IDEA确实方便。

代码部分

jFrame类

import javax.swing.*;

public class jFrame extends jMenuBar{
    //顶级容器
    JFrame jFrame = new JFrame("Just for test.");
    //菜单栏
    JMenuBar jMenuBar = new JMenuBar();

    /**
     * 各种设置数据
     */
    public void setAll(){
        setjFrame();
        addAll();
        //添加文本框进入面板
        jFrame.add(jTextArea);
        //设置监听者
        addListener();
        //设置文本区可编辑可用
        jTextArea.setEditable(true);
        jTextArea.setEnabled(true);
    }

    public void setjFrame() {//设置尺寸大小等杂七杂八
        //设置尺寸
        jFrame.setSize(800, 600);
        //起始位置居中
        jFrame.setLocationRelativeTo(null);
        //窗口不能调节大小
        //jFrame.setResizable(false);
        //关闭窗口,退出程序
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //窗口可见
        jFrame.setVisible(true);

    }

    public void addAll(){
        //添加菜单栏进入面板
        jFrame.setJMenuBar(jMenuBar);
        //往菜单栏扔菜单
        jMenuBar.add(file);
        jMenuBar.add(edit);
        jMenuBar.add(format);
        //各菜单扔进菜单栏
        addFileItem();
        addeditItem();
        addFormatItem();
    }
}

jMenuBar类

import javax.swing.*;
import java.awt.*;

public class jMenuBar extends JMenuItemActionListener{

    /**
     * 菜单1--文件
     */
    JMenu file = new JMenu("文件");
    //子选项1--新建
    JMenuItem newFile = new JMenuItem("新建");
    //子选项2--打开
    JMenuItem open = new JMenuItem("打开");
    //子选项3--保存
    JMenuItem save = new JMenuItem("保存");
    //子选项4--另存为
    JMenuItem saveAs = new JMenuItem("另存为");
    //子选项5--退出
    JMenuItem exit = new JMenuItem("退出");

    public void addFileItem(){//添加自选项的函数
        //子选项1New扔进菜单file
        file.add(newFile);
        //子选项2open扔进菜单file
        file.add(open);
        //子选项3save扔进菜单file
        file.add(save);
        //子选项4svaeAs扔进菜单file
        file.add(saveAs);
        //加入分割线
        file.addSeparator();
        //子选项5exit扔进菜单file
        file.add(exit);
    }

    /**
     * 菜单2--编辑
     */
    JMenu edit = new JMenu("编辑");
    //撤销
    //JMenuItem undo = new JMenuItem("撤销");

    //子选项1--复制
    JMenuItem copy = new JMenuItem("复制");
    //子选项2--黏贴
    JMenuItem paste = new JMenuItem("黏贴");
    //子选项3--删除
    JMenuItem delete = new JMenuItem("删除");
    //子选项4--剪切
    JMenuItem cut = new JMenuItem("剪切");
    //子选项5--查找
    JMenuItem search = new JMenuItem("查找");
    //子选项6--替换
    JMenuItem replace = new JMenuItem("替换");
    //子选项7--日期
    JMenuItem data = new JMenuItem("日期");

    public void addeditItem(){//添加自选项的函数
        //子选项0undo扔进菜单2edit
        //edit.add(undo);

        //子选项1copy扔进菜单2edit
        edit.add(copy);
        //子选项2paste扔进菜单2deit
        edit.add(paste);
        //子选项3copy扔进菜单2edit
        edit.add(delete);
        //子选项4cut扔进菜单2edit
        edit.add(cut);
        //子选项5search扔进菜单2edit
        edit.add(search);
        //子选项6replace扔进菜单2edit
        edit.add(replace);
        //子选项7data扔进菜单2edit
        edit.add(data);
    }

    /**
     * 菜单3--格式
     */
    JMenu format = new JMenu("格式");
    //子选项1--自动换行
    JCheckBoxMenuItem autoSetLineWrap = new JCheckBoxMenuItem("自动换行");
    public void addFormatItem(){//添加自选项的函数
        //子选项1扔进菜单1
        format.add(autoSetLineWrap);
    }

    public void addListener(){
        JMenu[] menu = new JMenu[3];
        menu[0] = this.file;
        menu[1] = this.edit;
        for (int j=0;j<2;j++){
            for (Component component:menu[j].getMenuComponents()) {
                if (component instanceof JMenuItem){
                    ((JMenuItem) component).addActionListener(this);
                }
            }
        }
        //JCheckBoxMenuItem类型不同,单独加一下,不然不能用
        autoSetLineWrap.addActionListener(this);
    }
}

JMenuItemActionListener类

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JMenuItemActionListener extends FileService implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        JMenuItem currentItem = (JMenuItem) e.getSource();
        switch (currentItem.getText()){
            //菜单1功能
            case "新建":
                newFile();
                break;
            case "打开":
                open();
                break;
            case "保存":
                save();
                break;
            case "另存为":
                saveAs();
                break;
            case "退出":
                exit();
                break;
            //菜单2功能
            /*case "撤销":
                setUndoManager();
                break;*/
            case "复制":
                copy();
                break;
            case "黏贴":
                paste();
                break;
            case "删除":
                delete();
                break;
            case "剪切":
                cut();
                break;
            case "查找":
                search();
                break;
            case "替换":
                replace();
                break;
            case "日期":
                data();
                break;
            //菜单3功能
            case "自动换行":
                autoSetLineWrap();
                break;
            default:
        }
    }
}

FileService类

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.text.DateFormat;
import java.util.Date;

public class FileService {

    UndoManager undoManager = new UndoManager();

    //文本框
    JTextArea jTextArea = new JTextArea("It is a text.");

    //定义一个文件选择框
    JFileChooser jFileChooser = null;
    //文件输入流
    FileReader fileReader = null;
    //文件输出流
    FileWriter fileWriter = null;
    //缓冲输入流
    BufferedReader bufferedReader = null;
    //缓冲输出流
    BufferedWriter bufferedWriter = null;

    //新建---(稍微暴力一下)
    void newFile() {
        jTextArea.setText("");
    }

    //打开
    void open(){
        //实例化对象
        jFileChooser = new JFileChooser();
        //设置弹出选择框标题
        jFileChooser.setDialogTitle("打开");
        //设置默认路径
        jFileChooser.showOpenDialog(null);
        //弹出窗口
        jFileChooser.setVisible(true);
        //检查文件选择框返回地址
        File check = jFileChooser.getSelectedFile();
        if(check==null){
            return;
        }
        //用address保存用户编辑文件的绝对路径
        String address = jFileChooser.getSelectedFile().getAbsolutePath();
        /*
        //Stringbuilder存储
        StringBuilder temp = new StringBuilder();
        try {
           //实例化文件输入流
           fileReader = new FileReader(address);
           //实例化缓冲字符输入流
           bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(address),"GBK"));
           String line= null;
           while ((line= bufferedReader.readLine()) != null) {
               temp.append(line);
               System.out.println(temp);
           }
           jf.jTextArea.setText(String.valueOf(temp.toString()));
           bufferedReader.close();
           fileReader.close();
       } catch (FileNotFoundException e1) {
           e1.printStackTrace();
       } catch (IOException e1) {
           e1.printStackTrace();
       }*/
        //字符串能存换行符,上边的StringBuilder亲测不能,所以就用这个先
        try {
            //实例化文件输入流
            fileReader = new FileReader(address);
            //实例化缓冲字符输入流
            bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(address),"UTF-8"));
            //设置字符串为空
            String str = "";
            //定义一个strall存储文件全部信息
            String strAll="";
            //缓冲区拿数据
            while((str = bufferedReader.readLine()) != null) {
                strAll += str + "\r\n";
            }
            System.out.println(strAll);
            jTextArea.setText(strAll);//一次性硬塞
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally {
            //关闭流文件,不关会占用系统内存
            try {
                bufferedReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                fileReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    //保存
    void save(){
        //实例化对象
        jFileChooser = new JFileChooser();
        //设置弹出选择框标题
        jFileChooser.setDialogTitle("保存");
        //设置默认路径
        jFileChooser.showSaveDialog(null);
        //弹出窗口
        jFileChooser.setVisible(true);
        //检查文件选择框返回地址
        File check = jFileChooser.getSelectedFile();
        if(check==null){
            return;
        }
        //用address保存用户编辑文件的绝对路径
        String address = jFileChooser.getSelectedFile().getAbsolutePath();
        if(address==null){
            return;
        }
        System.out.println(address);
        try {
            //实例化文件输出流写出文件
            fileWriter = new FileWriter(address);
            //实例化缓冲字符输出流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(address),"GBK"));
            //获取记事本字符串写出
            System.out.println(jTextArea.getText());
            fileWriter.write(jTextArea.getText());
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally {
            //关闭流文件,不关会占用系统内存
            try {
                bufferedWriter.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                fileWriter.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    //另存为
    void saveAs(){
        //实例化对象
        jFileChooser = new JFileChooser();
        //设置弹出选择框标题
        jFileChooser.setDialogTitle("保存");
        //设置默认路径
        jFileChooser.showSaveDialog(null);
        //弹出窗口
        jFileChooser.setVisible(true);
        //检查文件选择框返回地址
        File check = jFileChooser.getSelectedFile();
        if(check==null){
            return;
        }
        //用address保存用户编辑文件的绝对路径
        String address = jFileChooser.getSelectedFile().getAbsolutePath();
        System.out.println(address);
        if(address==null){
            return;
        }
        System.out.println(address);
        try {
            //实例化文件输出流写出文件
            fileWriter = new FileWriter(address);
            //实例化缓冲字符输出流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(address),"GBK"));
            //获取记事本字符串写出
            System.out.println(jTextArea.getText());
            fileWriter.write(jTextArea.getText());
        } catch (IOException e1) {
            e1.printStackTrace();
        }finally {
            //关闭流文件,不关会占用系统内存
            try {
                bufferedWriter.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                fileWriter.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    //退出
    void exit(){
        System.exit(0);
    }

    //撤销
    /*void setUndoManager(){
        if (undoManager.canUndo()){
            undoManager.undo();
        }
    }*/

    //复制
    void copy(){
        jTextArea.copy();
    }

    //黏贴
    void paste(){
        jTextArea.paste();
    }

    //删除
    void delete(){
        jTextArea.replaceRange("",jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
    }

    //剪切
    void cut(){
        jTextArea.cut();
    }

    /**
     * 查找
     */
    JFrame jInternalFrame;
    JPanel panel;
    //查找文本域
    JTextField jTextField = new JTextField(8);

    //标签--方向
    JLabel direction = new JLabel("方向");
    //单选按钮--向上
    JRadioButton toUp = new JRadioButton("向上");
    //单选按钮--向下
    JRadioButton toDown = new JRadioButton("向下");
    //设置按钮组
    ButtonGroup buttonGroup = new ButtonGroup();

    //区分大小写指针,1区分,0不区分
    int cs = 0;
    void search(){
        //内部框
        jInternalFrame = new JFrame();
        //创建面板
        panel = new JPanel(null);
        //标签--查找内容
        JLabel jLabel = new JLabel("查找内容:");

        //按钮1--查找下一个
        JButton searchNext = new JButton("查找下一个");
        //按钮2--取消
        JButton cancel = new JButton("取消");
        //复选框--区分大小写
        JCheckBox caseSensitive = new JCheckBox("区分大小写");

        //默认选中向下
        toDown.setSelected(true);

        //窗口基本设置
        jInternalFrame.setSize(500,300);
        jInternalFrame.setLocation(700,300);
        jInternalFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        //设置标签参数
        jLabel.setSize(100,50);
        jLabel.setLocation(30,10);
        jLabel.setFont(new Font(null, Font.PLAIN, 15));
        jLabel.setVisible(true);
        panel.add(jLabel);
        //方向标签
        direction.setSize(70,50);
        direction.setLocation(330,170);
        direction.setVisible(true);
        panel.add(direction);

        //设置文本域参数
        jTextField.setSize(250,30);
        jTextField.setLocation(120,20);
        jTextField.setEnabled(true);
        jTextField.setEditable(true);
        panel.add(jTextField);

        //设置两个功能按钮参数
        searchNext.setSize(100,30);
        searchNext.setLocation(80,100);
        cancel.setSize(100,30);
        cancel.setLocation(300,100);
        panel.add(searchNext);
        panel.add(cancel);

        //复选框参数
        caseSensitive.setSize(100,50);
        caseSensitive.setLocation(20,200);
        caseSensitive.setVisible(true);
        panel.add(caseSensitive);
        caseSensitive.setSelected(true);

        //添加按钮进按钮组
        buttonGroup.add(toUp);
        buttonGroup.add(toDown);
        //设置按钮参数
        toUp.setSize(70,50);
        toDown.setSize(70,50);
        toUp.setLocation(320,200);
        toDown.setLocation(400,200);
        panel.add(toUp);
        panel.add(toDown);

        //添加面板
        panel.setVisible(true);
        jInternalFrame.setContentPane(panel);
        jInternalFrame.setVisible(true);

        //添加监听者
        //查找下一个
        searchNext.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //见最下边的函数
                searchNextOne();
            }
        });
        //取消
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                end = 0;
                jInternalFrame.dispose();
            }
        });
        //区分大小写
        caseSensitive.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                cs = 1;
            }
        });
        //向上
        toUp.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
            }
        });
        //向下
        toDown.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
            }
        });
    }

    //替换
    void replace(){
        //内部框
        jInternalFrame = new JFrame();
        //创建面板
        panel = new JPanel(null);

        //窗口基本设置
        jInternalFrame.setSize(500,300);
        jInternalFrame.setLocation(700,300);
        jInternalFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        //文本域--2,替换为
        JTextField jTextField2 = new JTextField(8);
        //标签--查找内容
        JLabel jLabel = new JLabel("查找内容:");
        //标签--替换为
        JLabel jLabel2 = new JLabel("替换为:");
        //按钮1--查找下一个
        JButton searchNext = new JButton("查找下一个");
        //按钮2--替换
        JButton replace = new JButton("替换");
        //按钮3--全部替换
        JButton replaceAll = new JButton("全部替换");
        //按钮4--取消
        JButton cancel = new JButton("取消");
        //复选框--区分大小写
        JCheckBox caseSensitive = new JCheckBox("区分大小写");

        //设置标签参数
        jLabel.setSize(100,50);
        jLabel.setLocation(30,10);
        jLabel.setFont(new Font(null, Font.PLAIN, 15));
        jLabel.setVisible(true);
        panel.add(jLabel);
        //设置标签参数
        jLabel2.setSize(100,50);
        jLabel2.setLocation(30,60);
        jLabel2.setFont(new Font(null, Font.PLAIN, 15));
        jLabel2.setVisible(true);
        panel.add(jLabel2);

        //设置文本域1参数
        jTextField.setSize(200,30);
        jTextField.setLocation(120,20);
        jTextField.setEnabled(true);
        jTextField.setEditable(true);
        panel.add(jTextField);
        //设置文本域2参数
        jTextField2.setSize(200,30);
        jTextField2.setLocation(120,70);
        jTextField2.setEnabled(true);
        jTextField2.setEditable(true);
        panel.add(jTextField2);

        //设置按钮参数
        searchNext.setSize(100,30);
        searchNext.setLocation(350,20);
        replace.setSize(100,30);
        replace.setLocation(350,70);
        replaceAll.setSize(100,30);
        replaceAll.setLocation(350,120);
        cancel.setSize(100,30);
        cancel.setLocation(350,170);
        panel.add(searchNext);
        panel.add(replace);
        panel.add(replaceAll);
        panel.add(cancel);

        //复选框参数
        caseSensitive.setSize(100,50);
        caseSensitive.setLocation(20,200);
        caseSensitive.setVisible(true);
        panel.add(caseSensitive);
        caseSensitive.setSelected(true);

        //添加面板
        panel.setVisible(true);
        jInternalFrame.setContentPane(panel);
        jInternalFrame.setVisible(true);

        //添加监听者
        //查找下一个
        searchNext.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                searchNextOne();
            }
        });
        //替换
        replace.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (jTextField.getText()==null){
                    JOptionPane.showConfirmDialog(null,"无替换内容");
                }
                else if (jTextField.getText().equals(jTextArea.getSelectedText())){
                    jTextArea.replaceRange(jTextField2.getText(), jTextArea.getSelectionStart(), jTextArea.getSelectionEnd());
                }
            }
        });
        //全部替换
        replaceAll.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String temp = jTextField.getText();
                end = 0;//尾光标归0
                int x = jTextArea.getText().indexOf(temp, end);
                if (x==-1){//再按一次 全部替换 的弹出提示
                    JOptionPane.showConfirmDialog(null,"无替换内容");
                    return;
                }
                while(true){//方向向下
                    //索引
                    x = jTextArea.getText().indexOf(temp, end);
                    if (x==-1){
                        jTextArea.replaceRange(jTextField2.getText(),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
                        break;
                    }else{
                        jTextArea.replaceRange(jTextField2.getText(),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
                        end = x+temp.length();
                        jTextArea.setSelectionStart(x);
                        jTextArea.setSelectionEnd(x+temp.length());
                    }
                }
            }
        });
        //取消
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                end = 0;
                jInternalFrame.dispose();
            }
        });
        //区分大小写
        caseSensitive.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                cs = 1;
            }
        });
    }

    //时间日期
    void data(){
        Date a = new Date();
        DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
        System.out.println(mediumDateFormat.format(a));
        jTextArea.replaceRange(mediumDateFormat.format(a),jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());
    }

    //自动换行
    void autoSetLineWrap(){
        jTextArea.setLineWrap(true);
    }

    //查找函数
    int end = 0;// 尾光标
    void searchNextOne(){
        String temp = jTextField.getText();
        if (toDown.isSelected()){//方向向下
            if (end!=0){//卡位关键
                end=jTextArea.getSelectionEnd();
            }
            int x = jTextArea.getText().indexOf(temp, end);//indexof查找
            System.out.println(x+" 向下");//debug用
            if (x==-1){//没有则弹框
                JOptionPane.showConfirmDialog(null,"没找到 "+temp);
            }else{
                end = x+temp.length();
                jTextArea.setSelectionStart(x);
                jTextArea.setSelectionEnd(end);
            }
        }else if (toUp.isSelected()){//方向向上
            end=jTextArea.getSelectionEnd();
            int x = jTextArea.getText().lastIndexOf(temp,end-temp.length()-1);//indexof倒序查找
            System.out.println(x+" 向上");//debug用
            if(x==-1){//没有则弹框
                JOptionPane.showConfirmDialog(null,"没找到 "+temp);
            }else{
                end = x+temp.length();
                jTextArea.setSelectionStart(x);
                jTextArea.setSelectionEnd(end);
            }
        }
    }
}

最后的Main

public class Main{
    public static void main(String[] args){
        jFrame jf = new jFrame();
        jf.setAll();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值