栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java文本编辑器实现方法详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java文本编辑器实现方法详解

本文实例讲述了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字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138768.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号