import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import javax.swing.*;
import javax.swing.plaf.basic.BasicBorders.RadioButtonBorder;
/**
* 简易编辑器V1,0
*
* @author CGgeeker
*
*/
public class Editor02 extends JFrame implements ActionListener {
JComboBox comboBoxOfFontName, comboBoxOfFontsize;
JTextArea textArea;
JCheckBox checkBoxOfFontStylebold, checkBoxOfFontStyleitalic;
JRadioButton radiobuttonred, radiobuttonblue, radiobuttongreen;
ButtonGroup buttongroupcolor;
JPanel panelcolor;
Clipboard clipboard = getToolkit().getSystemClipboard();
public Editor02() {
// 设置窗体标题
super("简易编辑器V2.0");
// 获取屏幕分辨率
Dimension dim = this.getToolkit().getScreenSize();
// 窗体初始大小及定位
this.setBounds(dim.width / 4, dim.height / 4, (dim.width / 2 + 40),dim.height / 2);
// 设置内容面板按边界布局
this.getContentPane().setLayout(new BorderLayout());
// 1. 调用自定义方法addMenuBar()设置窗体的菜单栏
this.addMenuBar();
// 2. 调用自定义方法addToolBar()添加工具栏到内容面板
this.addToolBar();
// 3. 调用自定义方法addTextArea()添加文本区到内容面板
this.addTextArea();
}
/**
* 设置窗体菜单栏
*/
private void addMenuBar() {
// 创建菜单栏
JMenuBar menuBar = new JMenuBar();
// 创建“文件”菜单
JMenu filemenu = new JMenu("文件");
// 创建“编辑”菜单
JMenu editormenu = new JMenu("编辑");
// 创建“帮助”菜单
JMenu helpmenu = new JMenu("帮助");
// 创建菜单项
JMenuItem menuItemOfOpen = new JMenuItem("打开");
JMenuItem menuItemOfSave = new JMenuItem("保存");
JMenuItem menuItemOfExit = new JMenuItem("退出");
JMenuItem menuItemOfCopy = new JMenuItem("复制");
JMenuItem menuItemOfCut = new JMenuItem("剪切");
JMenuItem menuItemOfPaste = new JMenuItem("粘贴");
JMenuItem menuItemOfDelete = new JMenuItem("删除");
JMenuItem menuItemOfHelpexplanation = new JMenuItem("帮助说明");
// 给各个菜单项注册单击事件侦听器
menuItemOfOpen.addActionListener(this);
menuItemOfSave.addActionListener(this);
menuItemOfExit.addActionListener(this);
menuItemOfCopy.addActionListener(this);
menuItemOfCut.addActionListener(this);
menuItemOfPaste.addActionListener(this);
menuItemOfDelete.addActionListener(this);
menuItemOfHelpexplanation.addActionListener(new ActionListener() {
/**
* 帮助窗体(弹窗)
*/
@Override
public void actionPerformed(ActionEvent e) {
String separator = System.getProperty("line.separator");// 获得系统默认的分隔符-固定写法(写死了的!)
final JFrame helpjframe = new JFrame("帮助说明");
helpjframe.setBounds(410, 250, 600, 320);
helpjframe.setVisible(true);
helpjframe.setLayout(new BorderLayout());
TextArea helpjframetextArea = new TextArea();
helpjframetextArea.setText("该文本功能如下:" + separator + separator
+ "1.实现基本的TXT文件保存和打开" + separator + separator
+ "2.实现基本的剪辑,复制,粘贴,删除功能" + separator + separator
+ "3.实现基本的字体处理操作!");
helpjframetextArea.setForeground(getForeground().blue); // 设置前景色(字体的颜色)
helpjframetextArea.setFont(new Font(null, HEIGHT, 26)); // 设置字体大小,样式
JButton helpjframeButton = new JButton("退出");
helpjframe.add(helpjframetextArea);
helpjframe.add(helpjframeButton);
helpjframe.add(helpjframetextArea, "Center"); // 简单布局
helpjframe.add(helpjframeButton, "South");
helpjframeButton.addActionListener(new ActionListener() {
// 实现对“帮助说明”窗体中的“退出”按钮的监听事件处理
@Override
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(helpjframe, "是否退出?") == 0) {
helpjframe.setVisible(false);
}
}
});
}
});
// 给文本域添加鼠标监听器
// 菜单项加到"文件"菜单
filemenu.add(menuItemOfOpen);
filemenu.add(menuItemOfSave);
filemenu.addSeparator(); // 添加分隔线
filemenu.add(menuItemOfExit);
// 菜单项加到"编辑"菜单
editormenu.add(menuItemOfCopy);
editormenu.add(menuItemOfCut);
editormenu.add(menuItemOfPaste);
editormenu.add(menuItemOfDelete);
// 菜单项添加到"帮助"菜单
helpmenu.add(menuItemOfHelpexplanation);
// 将"文件"菜单,"编辑"菜单,"帮助"菜单加到菜单栏
menuBar.add(filemenu);
menuBar.add(editormenu);
menuBar.add(helpmenu);
// 设置窗体的菜单栏
this.setJMenuBar(menuBar);
}
/**
* 添加工具栏
*/
private void addToolBar() {
// 创建工具栏
JToolBar toolBar = new JToolBar();
// 设置工具栏的布局
toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
// 获取系统字体名字
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String fontNames[] = ge.getAvailableFontFamilyNames();
// 设置文字大小数组
String fontsizeNames[] = { "20", "23", "26", "29", "32", "35", "38","42" };
// 创建“字体”标签
Label fontlabel = new Label("字体:");
// 创建“大小”标签
Label fontsizelabel = new Label("大小:");
// 创建“风格”标签
Label fontstyle = new Label("风格:");
// 创建“颜色”标签
Label fontcolor = new Label("颜色:");
// 创建字体组合框
comboBoxOfFontName = new JComboBox(fontNames);
// 创建字体大小组合框
comboBoxOfFontsize = new JComboBox(fontsizeNames);
// 创建字体风格复选框
checkBoxOfFontStylebold = new JCheckBox("粗体");
checkBoxOfFontStyleitalic = new JCheckBox("斜体");
// 创建颜色面板
panelcolor = new JPanel();
// 创建颜色按钮组
buttongroupcolor = new ButtonGroup();
// 创建字体颜色单选按钮
radiobuttonred = new JRadioButton("红");
radiobuttonblue = new JRadioButton("蓝");
radiobuttongreen = new JRadioButton("绿");
// 字体组合框注册单击事件侦听器
comboBoxOfFontName.addActionListener(this);
// 字体大小组合框注册单击事件监听器
comboBoxOfFontsize.addActionListener(this);
// 给复选框注册单击事件监听器
checkBoxOfFontStylebold.addActionListener(this);
checkBoxOfFontStyleitalic.addActionListener(this);
// 给单选按钮注册单击事件监听器
radiobuttonred.addActionListener(this);
radiobuttonblue.addActionListener(this);
radiobuttongreen.addActionListener(this);
// 在字体组合框中添加“字体”标签
toolBar.add(fontlabel);
// 字体组合框加到工具栏
toolBar.add(comboBoxOfFontName);
// 在字体大小组合框中加“大小”标签
toolBar.add(fontsizelabel);
// 字体大小组合框加到工具栏
toolBar.add(comboBoxOfFontsize);
// 给复选框添加“风格”标签
toolBar.add(fontstyle);
// 字体风格复选框加到工具栏
toolBar.add(checkBoxOfFontStylebold);
toolBar.add(checkBoxOfFontStyleitalic);
// 给单选框添加“颜色”标签
toolBar.add(fontcolor);
// 字体颜色单选按钮加到颜色按钮组中
buttongroupcolor.add(radiobuttonred);
buttongroupcolor.add(radiobuttonblue);
buttongroupcolor.add(radiobuttongreen);
// 往面板中加入单选按钮
panelcolor.add(radiobuttonred);
panelcolor.add(radiobuttonblue);
panelcolor.add(radiobuttongreen);
// 颜色按钮组加到工具栏
toolBar.add(panelcolor);
// 工具栏加到内容面板北边
this.getContentPane().add(toolBar, "North");
}
/**
* 添加文本区
*/
private void addTextArea() {
textArea = new JTextArea("欢迎来到我的世界,上帝你好!");
textArea.setLineWrap(true); // 设置文本域为自动换行
textArea.setBackground(getBackground().pink); // 给文本域设置背景颜色为粉红
JScrollPane textareascrollPane = new JScrollPane(textArea); // 将文本域添加到含有下拉框(条)的面板中
this.getContentPane().add(textareascrollPane); // 将含有下拉框的面板放入内容面板中
this.getContentPane().add(textareascrollPane, "Center"); // 完成下拉框面板在内容面板中的边界布局,居中
// 设置下拉框面板的下拉条总是可见
textareascrollPane.setVerticalScrollBarPolicy(textareascrollPane.VERTICAL_SCROLLBAR_ALWAYS);
}
/*
* 单击事件处理
*/
@Override
public void actionPerformed(ActionEvent e) {
// 获取文本区的字体
Font font = textArea.getFont();
int fontStyle = font.getStyle();
int fontSize = font.getSize();
String fontName = font.getName();
// 判断是否点击了“文件”菜单
if (e.getSource() instanceof JMenuItem) {
// 处理打开文件事件
if (e.getActionCommand() == "打开") {
// System.out.println("open !"); //该语句用于设计师的测试
Openfile();
}
// 处理保存文件事件
if (e.getActionCommand() == "保存") {
// System.out.println("save !"); //该语句用于设计师的测试
Savefile();
}
// 点击退出就退出程序
if (e.getActionCommand() == "退出") {
// System.out.println("exit !"); //该语句用于设计师的测试
Exiteditor();
}
}
// 判断是否点击了“编辑”菜单
if (e.getSource() instanceof JMenuItem) {
// 处理复制事件
if (e.getActionCommand() == "复制") {
String tempText = textArea.getSelectedText(); // 拖动鼠标选取文本
// 创建能传输指定 String 的 Transferable。
StringSelection editText = new StringSelection(tempText);
/*
* 将剪贴板的当前内容设置到指定的 transferable 对象, 并将指定的剪贴板所有者作为新内容的所有者注册。
*/
clipboard.setContents(editText, null);
return;
}
// 处理粘贴事件
if (e.getActionCommand() == "粘贴") {
// textArea.paste();
// System.out.println("1234"); 测试数据
int start = textArea.getSelectionStart();
int end = textArea.getSelectionEnd();
Transferable contents = clipboard.getContents(this);
DataFlavor flavor = DataFlavor.stringFlavor;
if (contents.isDataFlavorSupported(flavor)) {
try {
String str;
str = (String) contents.getTransferData(flavor);
// System.out.println(str); 测试数据
textArea.replaceRange(str, start, end);
} catch (Exception ex) {
ex.printStackTrace();
}
}
// setSysClipboardText("");
return;
}
// 处理删除事件
if (e.getActionCommand() == "删除") {
int start = textArea.getSelectionStart();
int end = textArea.getSelectionEnd();
textArea.replaceRange("", start, end);
return;
}
// 处理剪切事件
if (e.getActionCommand() == "剪切") {
String tempText = textArea.getSelectedText();
StringSelection editText = new StringSelection(tempText);
clipboard.setContents(editText, null);
int start = textArea.getSelectionStart();
int end = textArea.getSelectionEnd();
textArea.replaceRange("", start, end); // 从Text1中删除被选取的文本。
return;
}
}
//对字体风格和文字大小的处理
if (e.getSource() instanceof JComboBox) {
//处理文字大小
if (e.getSource().equals(comboBoxOfFontsize)) {
// 获取字体大小组合选中字体大小
// fontSize = (int) comboBoxOfFontsize.getSelectedItem();
String fontSize2;
fontSize2 = (String) comboBoxOfFontsize.getSelectedItem();
// 修改文本区字体
textArea.setFont(new Font(fontName, fontStyle, Integer.parseInt(fontSize2)));
}
//处理字体风格
if (e.getSource().equals(comboBoxOfFontName)) {
// 获取字体组合选中字体名
fontName = (String) comboBoxOfFontName.getSelectedItem();
// 修改文本区字体
textArea.setFont(new Font(fontName, fontStyle, fontSize));
}
}
//对文字进行加粗或者还原处理
if (e.getSource().equals(checkBoxOfFontStylebold)) {
fontStyle = fontStyle ^ 1; // ^ 异或运算 (加粗:和1做异或运算)
textArea.setFont(new Font(fontName, fontStyle, fontSize));
}
//对文字进行倾斜或者还原处理
if (e.getSource().equals(checkBoxOfFontStyleitalic)) {
fontStyle = fontStyle ^ 2; // (斜体:和2做异或运算)
textArea.setFont(new Font(fontName, fontStyle, fontSize));
}
/*
* 对文字进行变色处理
*/
if (e.getSource().equals(radiobuttonred)) {
textArea.setForeground(Color.red);
}
if (e.getSource().equals(radiobuttonblue)) {
textArea.setForeground(Color.blue);
}
if (e.getSource().equals(radiobuttongreen)) {
textArea.setForeground(Color.green);
}
}
/**
*对系统的剪辑板进行覆盖的方法
*/
public static void setSysClipboardText(String writeMe) {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(writeMe); // 覆盖系统剪切板
clip.setContents(tText, null);
}
/**
* 打开文件方法封装
*/
public void Openfile() {
JFileChooser fileChooser = new JFileChooser("d:\\");
// fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
// 这句用于硬性规定只能选择文件夹,而不能选择文件
int returnVal = fileChooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) { // 如果选择了对话框中的确定按钮,就执行以下操作
File openfilePath = fileChooser.getSelectedFile();// 这个就是你选择的文件夹的路径
try { // 流操作
FileInputStream input = new FileInputStream(openfilePath); // FileInputStream文件输入流,将文件数据读出来
BufferedReader breader = new BufferedReader(new InputStreamReader(input)); // BufferedReader字符输入流提高读出速率
String tempreader = "";
while ((tempreader = breader.readLine()) != null) { // 将读出的数据一行一行地写入程序(文本编辑器)的文本域中
textArea.append(tempreader);
}
breader.close(); // 关闭字符输入流
input.close(); // 关闭文件输入流
} catch (FileNotFoundException e1) { // 异常处理
e1.printStackTrace(); // printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
} catch (IOException e1) {
e1.printStackTrace(); // printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
}
} else {
// 由于系统自己有取消的方法所以这里就不扩充了!
}
}
/**
* 保存文件方法封装
*/
public void Savefile() {
File savefilePath = new File("D:/javaeditortest/editor.txt"); // 保存文件的路径
try {
FileOutputStream output = new FileOutputStream(savefilePath); // FileOutputStream文件输出流,将数据写入文件
BufferedWriter bwriter = new BufferedWriter(new OutputStreamWriter(output)); // BufferedWriter字符输出流提高写入速率
for (String textareatemp : textArea.getText().split("\n")) { // 遍历,此处的textArea.getText().split("\n")可以当做一个数组,让后遍历处理,加上换行处理
bwriter.write(textareatemp); // 将文本域的内容写入文件中
bwriter.newLine();// 换行
}
bwriter.flush(); // 刷新字符输出流通道
bwriter.close(); // 关闭字符输出流
output.close(); // 关闭文件输出流
JOptionPane.showMessageDialog(null, "已经保存成功啦!");
} catch (FileNotFoundException e) {
e.printStackTrace(); // printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
} catch (IOException e) {
e.printStackTrace(); // printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
}
}
/**
* 退出文本编辑器的方法封装
*/
public void Exiteditor() {
if (JOptionPane.showConfirmDialog(this, "退出系统?") == 0) {
System.exit(0);
}
}
public static void main(String[] args) {
Editor02 editor = new Editor02();
editor.setVisible(true);
}
}