java 文本编辑器_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 js倒计时_Java实现倒计时的方法详解
这篇文章主要介绍了Java编程倒计时实现的三个示例,三种实现方法,具有一定参考价值,需要的朋友可以了解下. 实现Java编程中倒计时的方法有许多,下面我们通过三个示例来简单了解下它的实现过程. 1.简 ...
- java arrays.aslist()_Java中Arrays.asList()方法详解及实例
Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...
- java 复合_Java复合语句的使用方法详解
与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句.下面我们来看看有关复合语句的使用方法和实例. 复合语句由开括号"{"开始,闭括号& ...
- java中main是什么_Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
- java kaptcha_java相关:kaptcha验证码使用方法详解
java相关:kaptcha验证码使用方法详解 发布于 2020-6-7| 复制链接 摘记: 本文为大家分享了kaptcha验证码的使用方法,供大家参考,具体内容如下1.首先在pom.xml文件中导入 ...
- eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解
Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...
- Java SHA-256加密的两种实现方法详解
利用Apache的工具类实现加密,使用commons-codec包中的DigestUtils算法工具类(入参支持字符串.字节数组.文件流等): maven: 1 2 3 4 5 <depende ...
- java闭合数据_java多线程中线程封闭详解
线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...
- java 类参数_Java的数据类型和参数传递(详解)
Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...
- java lombok 视频_Java开发神器Lombok使用详解
最近正在写SpringBoot系列文章和录制视频教程,每次都要重复写一些Getter/Setter.构造器方法.字符串输出的ToString方法和Equals/HashCode方法等.甚是浪费时间,也 ...
最新文章
- c++以空格分开的输入数组_技术贴,MATLAB矩阵与数组汇总讲解
- 【收藏】go博客 zxysilent / blog
- pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码
- amoeba mysql读写分离_Mysql 实现读写分离的详细教程(amoeba)
- div动态消失的动画效果
- windows10怎么锁定计算机,别让Windows 10锁住亲友
- 师傅带徒弟 但是不能 教会徒弟饿死师傅!
- 驱动调试(六)利用中断打印
- 微信小程序开发的完整人性化版攻略
- paip.提高稳定性---自动检测sleep mysql数据库死连接以及kill
- ERROR 1010 (HY000): Error dropping database (can't rmdir './bolgdb/', errno: 17)
- Python源码剖析 - Python的总体架构
- pyecharts-饼图/极坐标/雷达/水球图/仪表盘/词云图/漏斗图/箱型图/热力图/日历图
- 计算机考研408专用笔记-----计算机组成原理
- Oracle多表关联查询
- 搜图出处的软件_以图搜图搜gif图片出处来源的懒人小工具
- Ubuntu操作系统输入法键位错乱解法记录(输入法无法正确打出~、等字符)
- 如何进行APP抓包 ? - 学习/实践
- widget jquery 理解
- 碧波庭---第十五届中国诚信企业家大会 — 碧波庭荣获 “中国美胸产业诚信品牌” !