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

网友投稿 326 2023-01-11


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程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务网关组件(微服务网关的主要功能)
下一篇:接口测试用例重复进行(接口用例编写测试用例)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~