本文实例讲述了Java文本编辑器实现方法。分享给大家供大家参考,具体如下:

结构分析:

界面布局 : EditFrame

main方法所在: EditText

打开功能实现:  FileReadThread

保存跟能实现:  save

实际运行效果:

附:完整代码实现

一、 EditFrame

包括一个菜单Menu

底部:日期时间

代码附上:

public class EditFrame extends JFrame {

// TODO 自动生成的构造函数存根

boolean saveFlag = false;

File saveFileRoot = null;

JFrame jFrame;

JPanel jPanelSouth;

JMenuBar jMenuBar1;

JMenu jMenu1;

JMenuItem jMenuItem1;

JMenuItem jMenuItem2;

JMenuItem jMenuItem3;

JMenuItem jMenuItem4;

JSeparator jSeparator1;

JTextArea jTextArea;

JScrollPane scrollPane;// 滚动条

public EditFrame() {

// TODO 自动生成的构造函数存根

jFrame = new JFrame("水中鱼之1999-文本编辑器");

jPanelSouth = new JPanel();

jMenuBar1 = new JMenuBar();

jMenu1 = new JMenu("文件");

jMenuItem1 = new JMenuItem("打开");

jMenuItem2 = new JMenuItem("保存");

jMenuItem3 = new JMenuItem("另存为");

jMenuItem4 = new JMenuItem("退出");

jSeparator1 = new JSeparator();

jTextArea = new JTextArea();

scrollPane = new JScrollPane(jTextArea);

jFrame.setSize(800, 500);

jFrame.setLocationRelativeTo(null);

jFrame.setVisible(false);

setLayout();

setSouthPanel();

// set relationship for your component

setRelationShip();

// 设置 scrollPane for TextArea

setScscrollPane();

iniClick();

}

private void setRelationShip() {

jFrame.add(BorderLayout.CENTER, scrollPane);

jFrame.add(BorderLayout.SOUTH, jPanelSouth);

jMenu1.add(jMenuItem1);

jMenu1.add(jMenuItem2);

jMenu1.add(jMenuItem3);

jMenu1.add(jSeparator1);

jMenu1.add(jMenuItem4);

jMenuBar1.add(jMenu1);

jFrame.setJMenuBar(jMenuBar1);

}

private void setLayout() {

GridLayout gridLayout = new GridLayout(1, 2);

jPanelSouth.setLayout(gridLayout);

}

private void setScscrollPane() {

// jTextArea.setLineWrap(true);// 设置满一行自动换行

scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

}

private void setSouthPanel() {

// add time for SouthPanel

JLabel jLabelDate = new JLabel("Date");

JLabel jLabelTime = new JLabel("Time");

Timer timeAction = new Timer(1000, new ActionListener() {

public void actionPerformed(ActionEvent e) {

long timemillis = System.currentTimeMillis();

// 转换日期显示格式

SimpleDateFormat date = new SimpleDateFormat("yyyy 年 MM 月 dd 日 ");

jLabelDate.setText(" 当前日期: " + date.format(new Date(timemillis)));

SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss ");

jLabelTime.setText(" 当前时间: " + time.format(new Date(timemillis)));

}

});

jPanelSouth.add(jLabelDate);

jPanelSouth.add(jLabelTime);

timeAction.start();

}

private void iniClick() {

jFrame.addWindowListener(new WindowListener() {

@Override

public void windowOpened(WindowEvent e) {

// TODO Auto-generated method stub

}

@Override

public void windowIconified(WindowEvent e) {

// TODO Auto-generated method stub

}

@Override

public void windowDeiconified(WindowEvent e) {

// TODO Auto-generated method stub

}

@Override

public void windowDeactivated(WindowEvent e) {

// TODO Auto-generated method stub

}

@Override

public void windowClosing(WindowEvent e) {

// TODO Auto-generated method stub

int x = JOptionPane.showConfirmDialog(null, "确认退出么?", "友情提示", JOptionPane.OK_CANCEL_OPTION,

JOptionPane.WARNING_MESSAGE);

if (x == 0) {

System.exit(0);

}

}

@Override

public void windowClosed(WindowEvent e) {

// TODO Auto-generated method stub

}

@Override

public void windowActivated(WindowEvent e) {

// TODO Auto-generated method stub

}

});

jMenuItem4.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

int x = JOptionPane.showConfirmDialog(null, "确认退出么?", "友情提示", JOptionPane.OK_CANCEL_OPTION,

JOptionPane.WARNING_MESSAGE);

if (x == 0) {

System.exit(0);

}

}

});

jMenuItem1.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

FileReadThread fileReadThread = new FileReadThread(EditFrame.this);// 开启文件读取线程

fileReadThread.start();

System.out.println(saveFileRoot);

saveFlag = true;

jTextArea.setText("");

}

});

jMenuItem3.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

Save save = new Save(EditFrame.this);

save.start();

saveFlag = true;

}

});

jMenuItem2.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if (!saveFlag) {

Save save = new Save(EditFrame.this);

save.start();

saveFlag = true;

} else {

new Save(EditFrame.this, saveFileRoot);

}

}

});

}

public JTextArea getjTextArea() {

return jTextArea;

}

public void setjTextArea(JTextArea jTextArea) {

this.jTextArea = jTextArea;

}

public File getSaveFileRoot() {

return saveFileRoot;

}

public void setSaveFileRoot(File saveFileRoot) {

this.saveFileRoot = saveFileRoot;

}

public JFrame getjFrame() {

return jFrame;

}

public void setjFrame(JFrame jFrame) {

this.jFrame = jFrame;

}

}

二、测试类 EditText

分两部分:

1.闪屏 由于加载页面需要时间 原想用 SplashScreen 由于打包成jar包才能用所以这里用jframe进行替代

闪屏图片直接粘贴到:

2.new 一个EditFrame 对象, 闪屏结束后设置为可见

public class EditText {

public static void main(String[] args) {

new Thread() {

@Override

public void run() {

// TODO Auto-generated method stub

EditFrame editFrame = new EditFrame();

JFrame jFrame = new JFrame();

JPanel jPanel = new javax.swing.JPanel(){

protected void paintComponent(java.awt.Graphics g){

super.paintComponent(g);

g.drawImage(new ImageIcon("experiment_bac.jpg").getImage(),0,0,400,250,null);

}

};

jFrame.add(jPanel);

jFrame.setVisible(true);

jFrame.setSize(400, 300);

jFrame.setLocationRelativeTo(null);

try {

sleep(1500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

jFrame.dispose();

editFrame.getjFrame().setVisible(true);

}

}.start();

}

}

三、FileReadThread

调用swing自带的 JFileChooser

选择文件路径

class FileReadThread extends Thread {

private EditFrame test;

public FileReadThread(EditFrame test ) {

this.test = test;

}

@Override

public void run() {

JFileChooser chooser = new JFileChooser("d:/");

chooser.setFileFilter(new FileFilter() {// 定义文件过滤器,仅显示文件夹和txt文本

@Override

public String getDescription() {

return null;

}

@Override

public boolean accept(File file) {

if (file.isDirectory() || file.getName().endsWith(".txt"))

return true;

return false;

}

});

int option = chooser.showOpenDialog(test);

if (option == JFileChooser.APPROVE_OPTION) {

File selFile = chooser.getSelectedFile();

try {

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(selFile), "gbk"));

test.setSaveFileRoot(selFile);

String line = null;

while ((line = reader.readLine()) != null) {

test.getjTextArea().append(line + "\n");

Thread.sleep(30);// 线程暂停,以看到读取过程效果

}

} catch (Exception e1) {

e1.printStackTrace();

}

JOptionPane.showMessageDialog(test, "读取完毕");

}

}

}

四、save 保存

保存的调用分三种:

如果该文件是打开的 那么保存到打开文件中

如果该文件还未保存 这调用:进行保存

如果该文件已经另存为,则直接保存到另存为得的目录下

public class Save extends Thread {

private EditFrame area;

private File saveFileRoot = null;

public Save(EditFrame area, File saveFileRoot) {

System.out.println(saveFileRoot + "123");

String text = area.getjTextArea().getText();

String[] lines = text.trim().split("\n");

try {

PrintWriter out = new PrintWriter(new FileOutputStream(saveFileRoot), true);

for (String line : lines)

out.println(line);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public Save(EditFrame area) {

this.area = area;

JFileChooser chooser = new JFileChooser();

chooser.setCurrentDirectory(new File("."));

chooser.setFileFilter(new FileFilter() {

@Override

public boolean accept(File f) {

return f.getName().toLowerCase().endsWith(".txt");

}

@Override

public String getDescription() {

return "SAVE TO";

}

});

int r = chooser.showSaveDialog(area);

if (r != JFileChooser.APPROVE_OPTION)

return;

File f = chooser.getSelectedFile();

area.setSaveFileRoot(f);

String text = area.getjTextArea().getText();

String[] lines = text.trim().split("\n");

try {

PrintWriter out = new PrintWriter(new FileOutputStream(f), true);

for (String line : lines)

out.println(line);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public File getSaveFileRoot() {

return saveFileRoot;

}

public void setSaveFileRoot(File saveFileRoot) {

this.saveFileRoot = saveFileRoot;

}

}

希望本文所述对大家java程序设计有所帮助。

java 文本编辑器_Java文本编辑器实现方法详解相关推荐

  1. java js倒计时_Java实现倒计时的方法详解

    这篇文章主要介绍了Java编程倒计时实现的三个示例,三种实现方法,具有一定参考价值,需要的朋友可以了解下. 实现Java编程中倒计时的方法有许多,下面我们通过三个示例来简单了解下它的实现过程. 1.简 ...

  2. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

  3. java 复合_Java复合语句的使用方法详解

    与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句.下面我们来看看有关复合语句的使用方法和实例. 复合语句由开括号"{"开始,闭括号& ...

  4. java中main是什么_Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  5. java kaptcha_java相关:kaptcha验证码使用方法详解

    java相关:kaptcha验证码使用方法详解 发布于 2020-6-7| 复制链接 摘记: 本文为大家分享了kaptcha验证码的使用方法,供大家参考,具体内容如下1.首先在pom.xml文件中导入 ...

  6. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  7. Java SHA-256加密的两种实现方法详解

    利用Apache的工具类实现加密,使用commons-codec包中的DigestUtils算法工具类(入参支持字符串.字节数组.文件流等): maven: 1 2 3 4 5 <depende ...

  8. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  9. java 类参数_Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...

  10. java lombok 视频_Java开发神器Lombok使用详解

    最近正在写SpringBoot系列文章和录制视频教程,每次都要重复写一些Getter/Setter.构造器方法.字符串输出的ToString方法和Equals/HashCode方法等.甚是浪费时间,也 ...

最新文章

  1. c++以空格分开的输入数组_技术贴,MATLAB矩阵与数组汇总讲解
  2. 【收藏】go博客 zxysilent / blog
  3. pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码
  4. amoeba mysql读写分离_Mysql 实现读写分离的详细教程(amoeba)
  5. div动态消失的动画效果
  6. windows10怎么锁定计算机,别让Windows 10锁住亲友
  7. 师傅带徒弟 但是不能 教会徒弟饿死师傅!
  8. 驱动调试(六)利用中断打印
  9. 微信小程序开发的完整人性化版攻略
  10. paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill
  11. ERROR 1010 (HY000): Error dropping database (can't rmdir './bolgdb/', errno: 17)
  12. Python源码剖析 - Python的总体架构
  13. pyecharts-饼图/极坐标/雷达/水球图/仪表盘/词云图/漏斗图/箱型图/热力图/日历图
  14. 计算机考研408专用笔记-----计算机组成原理
  15. Oracle多表关联查询
  16. 搜图出处的软件_以图搜图搜gif图片出处来源的懒人小工具
  17. Ubuntu操作系统输入法键位错乱解法记录(输入法无法正确打出~、等字符)
  18. 如何进行APP抓包 ? - 学习/实践
  19. widget jquery 理解
  20. 碧波庭---第十五届中国诚信企业家大会 — 碧波庭荣获 “中国美胸产业诚信品牌” !

热门文章

  1. 超详细,手把手 教你 SQLyog 安装教程
  2. rust腐蚀机场蓝卡_rust怎么弄蓝卡和红卡
  3. Navicat\PLSQLDev连接oracle相关问题记录
  4. PCB SI9000阻抗计算引擎Web方式实现方法
  5. Hitool工具烧写程序(按分区烧写)
  6. 推荐系统学习(一)--电影推荐系统搭建
  7. Brother-MFC系列打印机 PDF双面打印设置
  8. 5个很牛的黑科技网站分享
  9. fireworks CS6安装教程
  10. 用纯JavaScript制作扫雷游戏-1