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程序设计有所帮助。
以上是 Java文本编辑器实现方法详解 的全部内容, 来源链接: utcz.com/z/312752.html