前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java-文本编辑器实现

Java-文本编辑器实现

作者头像
圆号本昊
发布2021-09-24 14:42:09
7760
发布2021-09-24 14:42:09
举报
文章被收录于专栏:github@hornhuanggithub@hornhuang

结构分析:

  • 界面布局 : EditFrame
  • main方法所在: EditText
  • 打开功能实现:  FileReadThread
  • 保存跟能实现:  save

实际运行效果:

附:完整代码实现

一、 EditFrame

包括一个菜单Menu

底部:日期时间

代码附上:

代码语言:javascript
复制
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 对象, 闪屏结束后设置为可见

代码语言:javascript
复制
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 

选择文件路径

代码语言:javascript
复制
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 保存

保存的调用分三种:

  • 如果该文件是打开的 那么保存到打开文件中
  • 如果该文件还未保存 这调用:进行保存
  • 如果该文件已经另存为,则直接保存到另存为得的目录下
代码语言:javascript
复制
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;
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结构分析:
  • 实际运行效果:
    • 一、 EditFrame
      • 代码附上:
        • 三、FileReadThread
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档