最近老师布置作业要我们搞个简易编辑器,没看题的我直接莽了,规定时间内还没做完(小菜鸡做了七个小时,从0到有TwT)
这次的编辑器主要实现以下功能
// 编写一个简易记事本,界面要求使用菜单栏和工具栏。
// 包括以下功能:
// •文本文件的新建、打开和保存,其中打开和保存文件时要求使用文件选择器
// •编辑功能:复制、粘贴、剪切、清空、全选
// •字体颜色设置:要求使用颜色选择器
// •字体样式设置:正常、粗体、倾斜
// •字体名称设置:宋体、黑体、幼圆
// •关于记事本的信息:要求使用一个对话框
// •设计一个登录面对话框,模拟用户登录(在记事本显示后,弹出该对话框,模拟验证用户合法性,非法用户重试3此后退出系统)
记事本信息那个我没写,别的博主应该有写的
下面直接放代码
这是主文件,文件名JtextareaTester.java,下面还有两个用于用户登录的文件,所以没运行出来的uu不要急,一步一步来
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.plaf.FontUIResource;
import javax.swing.text.DefaultStyleddocument;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.*;
import java.util.Enumeration;
// 编写一个简易记事本,界面要求使用菜单栏和工具栏。
// 包括以下功能:
// •文本文件的新建、打开和保存,其中打开和保存文件时要求使用文件选择器
// •编辑功能:复制、粘贴、剪切、清空、全选
// •字体颜色设置:要求使用颜色选择器
// •字体样式设置:正常、粗体、倾斜
// •字体名称设置:宋体、黑体、幼圆
// •关于记事本的信息:要求使用一个对话框
// •设计一个登录面对话框,模拟用户登录(在记事本显示后,弹出该对话框,模拟验证用户合法性,非法用户重试3此后退出系统)
public class JtextareaTester extends Jframe implements ActionListener {
//定义三个主菜单的名字
private JMenu fileMenu,editMenu,SetFontmenu;
//定义菜单栏下选项的名字
private JMenuItem miNewFile, miOpen, miSave, miExit;//新建,打开,保存,退出
private JMenuItem miCopy, miPaste, miCut, miSelectAll, miClearAll;//复制,粘贴,剪切,全选,清空
private JMenuItem miSetFontSong,miSetFontHei,miSetFontYou,miSetBOLD,miSetITALIC;//同上,这几个是设置字体的
//定义工具栏中名字
private JButton btnCopy, btnPaste, btnCut, btnExit, btnColor;
//文本窗口
private Jtextarea ta;
private final static String APP_NAME = "简易记事本";
public JtextareaTester() {
super(APP_NAME);//最上方名字
this.setSize(1000, 1000);//编辑器大小
this.setLocationRelativeTo(null); // 窗口置于显示屏的中央
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//叉叉,不设置就无法真正关闭,然后就bug了
// 菜单栏
JMenuBar mb = new JMenuBar();
this.setJMenuBar(mb);// 为窗体设置菜单栏
// 菜单
fileMenu = new JMenu("文件(F)");
fileMenu.setMnemonic('F');
SetFontmenu=new JMenu("设置字体(S)");
SetFontmenu.setMnemonic('S');
editMenu = new JMenu("编辑(E)");
editMenu.setMnemonic('E');
// 菜单添加到菜单栏
mb.add(fileMenu);
mb.add(editMenu);
mb.add(SetFontmenu);
miNewFile = new JMenuItem("新建", new ImageIcon("zuoye3/img/NewFile.png"));
miNewFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));//设置按键,也就是通常的ctrl+N
miNewFile.addActionListener(new NewFileListener());//为菜单项注册事件监听器,找下面的class NewFileListener
miOpen = new JMenuItem("打开", new ImageIcon("zuoye3/img/open.png"));
miOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
miOpen.addActionListener(this); // 这里混合使用一下,涉及到事件处理的三种方式,这里直接连接下面的public接口
miSave = new JMenuItem("保存", new ImageIcon("zuoye3/img/save.png"));
miSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
miSave.addActionListener(new SaveListener());
miExit = new JMenuItem("退出(X)", new ImageIcon("zuoye3/img/exit.png"));
miExit.setMnemonic('X');
miExit.addActionListener(this);
miCopy = new JMenuItem("复制", new ImageIcon("zuoye3/img/copy.png"));
miCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
miCopy.addActionListener(new CopyListener());
miPaste = new JMenuItem("粘贴", new ImageIcon("zuoye3/img/paste.png"));
miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
miPaste.addActionListener(new PasteListener());
miCut = new JMenuItem("剪切", new ImageIcon("zuoye3/img/cut.png"));
miCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK));
miCut.addActionListener(new cutListener());
miSelectAll = new JMenuItem("全选", new ImageIcon("zuoye3/img/select all.png"));
miSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK));
miSelectAll.addActionListener(new SelectAllListener());
miClearAll = new JMenuItem("清空", new ImageIcon("zuoye3/img/Clear all.png"));
miClearAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK));
miClearAll.addActionListener(new ClearAllListener());
miSetFontSong= new JMenuItem("宋体");
miSetFontSong.addActionListener(new SongListener());
miSetFontHei= new JMenuItem("黑体");
miSetFontHei.addActionListener(new HeiListener());
miSetFontYou= new JMenuItem("幼圆");
miSetFontYou.addActionListener(new youListener());
miSetBOLD=new JMenuItem("加粗");
miSetBOLD.addActionListener(new boldListener());
miSetITALIC=new JMenuItem("斜体");
miSetITALIC.addActionListener(new italicListener());
// 菜单项添加到菜单
//文件
fileMenu.add(miNewFile);
fileMenu.add(miOpen);
fileMenu.add(miSave);
fileMenu.addSeparator(); // 分割线
fileMenu.add(miExit);
//编辑
editMenu.add(miCopy);
editMenu.add(miPaste);
editMenu.add(miCut);
editMenu.add(miClearAll);
editMenu.addSeparator(); // 分割线
editMenu.add(miSelectAll);
//字体设置
SetFontmenu.add(miSetFontSong);
SetFontmenu.add(miSetFontHei);
SetFontmenu.add(miSetFontYou);
SetFontmenu.addSeparator(); // 分割线
SetFontmenu.add(miSetBOLD);
SetFontmenu.add(miSetITALIC);
// 工具栏
JToolBar tb = new JToolBar("编辑工具栏");
ta = new Jtextarea();
ta.setLineWrap(true); // 自动换行
JScrollPane sp = new JScrollPane(ta);//按需求设置滚动条
//下面设计图片的调用,在主文件的这个文件夹里面,创建一个子文件夹就行,然后里面存图片
//比如说我这个JtextareaTester.java文件在文件下zuoye3下面,所以我在zuoye3里面建立img文件夹
//这里路径要设置成相对路径,就是相对主文件所在的文件夹而言的路径,直接跨过D盘,从zuoye3进入开始找img
btnCopy = new JButton(new ImageIcon("zuoye3/img/Copy.png"));
btnCopy.setToolTipText("复制");//设置名字
btnCopy.addActionListener(new CopyListener()); // 注册事件监听器,同上
btnPaste = new JButton(new ImageIcon("zuoye3/img/Paste.png"));
btnPaste.setToolTipText("粘贴");
btnPaste.addActionListener(new PasteListener());
btnCut = new JButton(new ImageIcon("zuoye3/img/cut.png"));
btnCut.setToolTipText("剪切");
btnCut.addActionListener(new cutListener());
btnExit = new JButton(new ImageIcon("zuoye3/img/exit.png"));
btnExit.setToolTipText("退出");
btnExit.addActionListener(new ExitListener());
btnColor = new JButton(new ImageIcon("zuoye3/img/color.png"));
btnColor.setToolTipText("颜色");
btnColor.addActionListener(new corlorListener());
// 将按钮添加到工具栏
tb.add(btnCopy);
tb.add(btnPaste);
tb.add(btnCut);
tb.add(btnExit);
tb.add(btnColor);
//工具栏添加到文本窗口里面
this.add(tb, "North");
this.add(sp, "Center");
}
class NewFileListener implements ActionListener { // 新建————内部类
public void actionPerformed(ActionEvent e) {
ta.setdocument(new DefaultStyleddocument());//触发的方法
}
}
class SaveListener implements ActionListener {// 保存
public void actionPerformed(ActionEvent e) {
JFileChooser filechooser = new JFileChooser(); // 文件选择器
int i = filechooser.showSaveDialog(JtextareaTester.this);
if (i == JFileChooser.APPROVE_OPTION) {
File f = filechooser.getSelectedFile();
try {
FileOutputStream out = new FileOutputStream(f);
out.write(ta.getText().getBytes());
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
class CopyListener implements ActionListener { // 复制
public void actionPerformed(ActionEvent e) {
ta.copy();
}
}
class PasteListener implements ActionListener { // 粘贴
public void actionPerformed(ActionEvent e) {
ta.paste();
}
}
class cutListener implements ActionListener { // 剪切
public void actionPerformed(ActionEvent e) {
ta.cut();
}
}
class ExitListener implements ActionListener { // 退出
public void actionPerformed(ActionEvent e) {
dispose();
}
}
class corlorListener implements ActionListener { // 颜色选择
public void actionPerformed(ActionEvent e){
JButton btn=(JButton)e.getSource();
if(btn==btnColor){
Color color= JColorChooser.showDialog(JtextareaTester.this,"请选择颜色", Color.RED); // 颜色选择器
if(color!=null) // 返回颜色不为null
ta.setForeground(color);
}
}
}
class SelectAllListener implements ActionListener { // 复制
public void actionPerformed(ActionEvent e) {
ta.selectAll();
}
}
//ClearAll
class ClearAllListener implements ActionListener { // 清空
public void actionPerformed(ActionEvent e) {
ta.setText("");
}
}
class SongListener implements ActionListener { // 宋体
public void actionPerformed(ActionEvent e) {
Font font = new Font("宋体", Font.PLAIN, 16);
ta.setFont(font);
}
}
class HeiListener implements ActionListener { // 黑体
public void actionPerformed(ActionEvent e) {
Font font = new Font("黑体", Font.PLAIN, 16);
ta.setFont(font);
}
}
class youListener implements ActionListener { // 幼圆
public void actionPerformed(ActionEvent e) {
Font font = new Font("幼圆", Font.PLAIN, 16);
ta.setFont(font);
}
}
class boldListener implements ActionListener { //加粗
public void actionPerformed(ActionEvent e) {
Font f = new Font("TimesRoman", Font.BOLD, 16);
ta.setFont(f);
}
}
class italicListener implements ActionListener {//斜体
public void actionPerformed(ActionEvent e) {
Font f = new Font("TimesRoman", Font.ITALIC, 16);
ta.setFont(f);
}
}
//这里定义打开文件的功能
public void actionPerformed(ActionEvent e) {
JMenuItem mi = (JMenuItem) e.getSource();
if (mi == miOpen) { // 打开文本文件
JFileChooser fc = new JFileChooser(); // 文件选择器
FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文件(*.txt)", "txt");
fc.addChoosableFileFilter(filter); // 添加一个过滤器
filter = new FileNameExtensionFilter("THML文件(*.htm,*.html)", "htm", "html");
fc.addChoosableFileFilter(filter);// 添加一个过滤器
int returnVal = fc.showOpenDialog(this);// 显示打开文件对话框
if (returnVal != JFileChooser.APPROVE_OPTION)// 判断用户操作
return;
String fileName = fc.getSelectedFile().getAbsolutePath(); // 获取用户选择的文件
StringBuffer sb = new StringBuffer("");
try {
BufferedReader br = new BufferedReader(new FileReader(fileName));
String str = br.readLine();
while (str != null) {
sb.append(str + "n");
str = br.readLine();
}
br.close();
ta.setText(sb.toString());
this.setTitle(APP_NAME + "-" + fileName); // 窗体标题初始化
} catch (Exception e1) {
ta.setText(e1.getMessage());
}
}
}
// 初始化全局字体
private static void initGlobalFont() {
FontUIResource fontUIResource = new FontUIResource(new Font("宋体", Font.PLAIN, 16));
for (Enumeration
图片可以去网上找,比如这个最新图标下载, 最新PNG ICO, Icons, 图标之家 (icosky.com)
以下两个文件不是自己编写的,只能说开源很有用,如果程序里面用不到用户登陆的检验的话,可以在主文件里面的main里面只写这些就好了
public static void main(String[] args) {
initGlobalFont(); // 初始化全局所有字体
JtextareaTester frm = new JtextareaTester();
frm.setVisible(true);
}
需要用户验证的,不用管这一小段,直接1,2,3这三个文件复制粘贴改一改照片地址就能用
下面是这两个文件
第二个文件,文件名UserLoginResult.java
这个用于检验用户
public enum UserLoginResult{
VALID, //验证合法
INVALID, //验证非法
CANCEL //用户取消或关闭对话框
}
第三个文件,文件名FrmUserLogin.java,用户验证的主要程序
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FrmUserLogin extends JDialog{ // 登录对话框
UserLoginResult result=UserLoginResult.CANCEL;// 用户登录结果
public FrmUserLogin(Jframe ower){
super(ower,"用户登陆");
this.setSize(260, 140);
this.setLocationRelativeTo(ower); //窗口置于所依附窗体的中央
this.setResizable(false);
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
GridBagLayout layout=new GridBagLayout(); //网格包布局
this.setLayout(layout); //给对话框容器设置布局管理器
JLabel lblUserName=new JLabel("用户名:");
JLabel lblpwd=new JLabel("密码:");
JTextField txtUserName=new JTextField(15);
JTextField txtpwd=new JPasswordField(15);
JButton btnOK=new JButton("登陆");
JButton btnCancel=new JButton("取消");
GridBagConstraints st=new GridBagConstraints();
st.fill=GridBagConstraints.NONE;
st.anchor=GridBagConstraints.CENTER;
add(lblUserName, set(st, 0, 0, 1, 1));
add(txtUserName, set(st, 1, 0, 3, 1));
add(lblpwd, set(st, 0, 1, 1, 1));
add(txtpwd, set(st, 1, 1, 3, 1));
add(btnOK, set(st, 1, 2, 1, 1));
add(btnCancel, set(st, 2, 2, 1, 1));
btnOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(txtUserName.getText().trim().equals("ABC") &&txtpwd.getText().equals("123")){
result=UserLoginResult.VALID;
}
else{
result=UserLoginResult.INVALID;}
setVisible(false); //关闭对话框
}
});
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
result=UserLoginResult.CANCEL;
setVisible(false); //关闭对话框
System.exit(0); // 退出应用程序
}
});
}
// 修改约束对象的约束条件
GridBagConstraints set(GridBagConstraints st, int x,int y,int w,int h){
st.gridx=x;
st.gridy=y;
st.gridwidth=w;
st.gridheight=h;
return st;
}
}
以上肝了。。。。六个小时应该,有一些bug应该来不及修改,有能搞出来的,比如说用户登录那个窗口直接叉掉就不用登录了。。。。离谱哈哈哈
对了。账户密码的话,第三个文件里面设置了,账户ABC和密码123,可以自己改
以上,在校大学生,继续肝java



