做这个文本编辑器的时候,分为几步来做;

第一步,先为文本编辑器搭好框架也就是布局。大小用灵活的能够跟着屏幕大小变动的设计,用Dimension dim=getToolkit().getscreenseize来获取屏幕大小然后设置文本编辑器的时候就用这个dim去设。布局的话采用BorderLayout布局管理,将textArea文本框放在中心以便于能随着文本编辑器的拉大缩小而跟着变动,将工具条toolbar放在了north,然后将工具条中的组件一一加上。为了使正题代码更加简洁,我最后用一个函数addmenu()来加菜单。

第二步组件添加的步骤:注意事项 1、之后要用到的组件要在构造函数前面声明,不然后面调不到这个变量。 2、添加textarea的时候最好用this.getcontentpane去加,因为我们用到的JFrame本身就是类似于一个pane。3、个人习惯要实现AcitonLiseter的时候用的是e.getactioncommand所以最好在每一步都设置好命令这样是有好处的,之后你会发现在做颜色和字体的同步时候你会发现这样是挺好用的,之前我就是因为有的想偷懒没设,后面怎么都不能同步弄了好久。所以这里特别提醒。4.以为颜色这个东西是互斥的对吧,所以就要做一个buttongroup来使他们互斥。

第三步,实现AcitonListener的分流:因为实现的监听实在是太多了,如果一个个去找的话是非常耗时的,这里采用分流的方式,可以大大减少寻找所需时间。

第四步:实现按钮功能:  注意事项:1、在获取comboxname时要注意设置这个是可以编辑的,也就是说有可能用户会乱输导致程序出错,所以我们这里要捕捉异常用到try-catch语句。在设置字体的时候我用到了一个抽取代码。为什么呢?因为我后面要是菜单中的字体与工具条中的字体样式进行同步这样我就用到了相同的代码,所以就将相同的代码提取出来。同理在颜色按钮哪里也是如此。

第五步:设置快捷菜单就是右键点击弹出快捷菜单及快捷键的添加 如ctrl+c这种类型,我这里做的是ctrl+i 剪切,ctrl+j复制,ctrl+k 粘贴 快捷菜单的步骤是:1声明 2new对象 3挂到容器中去4在容器中监听鼠标动作 5监听鼠标右键被点击时,把快捷菜单show出来,6菜单项的响应动作 7为菜单项设置快捷键

特别说明一下我这里大部分用的的是数组添加组件。这种方法比较灵活。也可以一定程度上减少代码量

到这里基本上就可以完成了。具体的代码bug调试我在后面说明

下面是我已经可以实现的代码 具体的我会在后面用//备注。

界面如下:

代码bug:1 在向comboxSize中输入错误信息或者其他值按回车的时候会出现两次错误提示或者加入两个数,我们用来解决这个bug,这个bug的原理是jcombox组件事件响应的时候会在内容更新之后自动再调用一次即使是在编辑框中输入后回车并没有执行insertitem也会调用,因此我们通过卫条件过滤掉自动调用的那一次事件响应。

bug2:一开始我们点击运行程序颜色并没有直接是红色 要点击一次之后才能变,所以我们在menu()里面将红色的radiobutton设为默认的,这样就成功解决了。

package cn.hncu.gui5;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;

public class EditorJFrame extends JFrame implements ActionListener, MouseListener {
private JTextArea text;
private JComboBox comboxName, comboxSize;
private JCheckBox chkBold, chkItalic;
private JRadioButton radioColor[];
private Font font=null;
private JCheckBoxMenuItem chkMenuItems[];
private JRadioButtonMenuItem[] radioMenuItem;
private JPopupMenu popMenu;

public EditorJFrame() {
super("文本编辑器");
Dimension dim = getToolkit().getScreenSize();
this.setBounds(dim.width / 4, dim.height / 4, dim.width / 2,
dim.height / 2);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//实现窗口关闭按钮

JToolBar toolbar = new JToolBar();
this.getContentPane().add(toolbar, BorderLayout.NORTH);//加工具条

GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();//获取本地字体并添加ActiomListener
String fontsName[] = ge.getAvailableFontFamilyNames();
comboxName = new JComboBox(fontsName);
toolbar.add(comboxName);
comboxName.addActionListener(this);

String[] sizeStr = { "20", "30", "40", "50", "60", "70" };//做字体大小的combox组件并添加ActiomListener
comboxSize = new JComboBox(sizeStr);
toolbar.add(comboxSize);
comboxSize.setEditable(true);
comboxSize.addActionListener(this);

chkBold = new JCheckBox("粗体");//做两个字体样式的组件并添加ActiomListener
chkItalic = new JCheckBox("斜体");
toolbar.add(chkBold);
chkBold.setActionCommand("bold");
chkBold.addActionListener(this);
toolbar.add(chkItalic);
chkItalic.setActionCommand("italic");
chkItalic.addActionListener(this);

text = new JTextArea("welcome 欢迎");//把文本框放进去初始为 welcome 欢迎
this.getContentPane().add(new JScrollPane(text));

String[] strColor = { "红", "绿", "蓝" };
radioColor = new JRadioButton[strColor.length];
ButtonGroup group = new ButtonGroup();
for (int i = 0; i < radioColor.length; i++) {
radioColor[i] = new JRadioButton(strColor[i]);
toolbar.add(radioColor[i]);
group.add(radioColor[i]);
radioColor[i].addActionListener(this);
}
radioColor[0].setActionCommand("red");
radioColor[1].setActionCommand("green");
radioColor[2].setActionCommand("blue");
radioColor[0].setSelected(true);
text.setForeground(Color.red);

addMyMenu();

this.setVisible(true);
}

private void addMyMenu() {
JMenuBar menubar=new JMenuBar();
setJMenuBar(menubar);
String[] menuStr={"文件","编辑","帮助"};
JMenu menu[]=new JMenu[menuStr.length];
for(int i=0;i<menu.length;i++){
menu[i]=new JMenu(menuStr[i]);
menubar.add(menu[i]);
}

//文件菜单
String[] menu0Str={"打开","保存","退出"};
JMenuItem[] menuText=new JMenuItem[menu0Str.length];
for(int i=0;i<menuText.length;i++){
menuText[i]=new JMenuItem(menu0Str[i]);
menu[0].add(menuText[i]);
if(i==1){
menu[0].addSeparator();
}
}
menuText[2].setActionCommand("exit");
menuText[2].addActionListener(this);

JMenu menuStyle = new JMenu("字形");
menu[1].add(menuStyle);//菜单添加菜单,被添加的即是二级菜单

String[] menuFont={"粗体","斜体"};
chkMenuItems=new JCheckBoxMenuItem[menuFont.length];
for(int i=0;i<chkMenuItems.length;i++){
chkMenuItems[i]=new JCheckBoxMenuItem(menuFont[i]);
menuStyle.add(chkMenuItems[i]);
chkMenuItems[i].addActionListener(this);
}
//设置命令
chkMenuItems[0].setActionCommand("bold");
chkMenuItems[1].setActionCommand("italic");

//编辑-颜色菜单
JMenu menuColor= new JMenu("颜色");
menu[1].add(menuColor);
String[] colorStr={"红","绿","蓝"};
radioMenuItem=new JRadioButtonMenuItem[colorStr.length];
ButtonGroup group=new ButtonGroup();
for(int i=0;i<radioMenuItem.length;i++){
radioMenuItem[i]=new JRadioButtonMenuItem(colorStr[i]);
menuColor.add(radioMenuItem[i]);
group.add(radioMenuItem[i]);
radioMenuItem[i].addActionListener(this);
}
radioMenuItem[0].setActionCommand("red");
radioMenuItem[1].setActionCommand("green");
radioMenuItem[2].setActionCommand("blue");

popMenu =new JPopupMenu();
String[] strPopMenu={"剪切","复制","粘贴"};
JMenuItem[] popMenuItems=new JMenuItem[strPopMenu.length];
for(int i=0;i<popMenuItems.length;i++){
popMenuItems[i]=new JMenuItem(strPopMenu[i]);
popMenu.add(popMenuItems[i]);
popMenuItems[i].addActionListener(this);
}
popMenuItems[0].setActionCommand("cut");
popMenuItems[1].setActionCommand("copy");
popMenuItems[2].setActionCommand("paste");

text.add(popMenu);
text.addMouseListener(this);

//设置快捷键
popMenuItems[0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK));
popMenuItems[1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, InputEvent.CTRL_MASK));
popMenuItems[2].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, InputEvent.CTRL_MASK));

}
boolean isFilte=false;
String str="";
@Override
public void actionPerformed(ActionEvent e) {
if(isFilte&&e.getSource()==comboxSize){
isFilte=false;
return;
}

if (e.getSource() instanceof JComboBox
|| e.getSource() instanceof JCheckBox) {
// 提取字体
String fontName = (String) comboxName.getSelectedItem();
//字体大小
int foneSize = 0;
String strSize = (String) comboxSize.getSelectedItem();
try {
foneSize = Integer.parseInt(strSize);
} catch (NumberFormatException e1) {

String msg = "\"" + strSize + "\"不能转换为整数,请重新输入";
JOptionPane.showMessageDialog(this, msg);
if(!strSize.equals(str)){
str=strSize;
isFilte=true;
}
return;
}

//字体样式

int style = changleStyle(e);
   font = new Font(fontName, style, foneSize);
   text.setFont(font);
}
if(e.getSource()==comboxSize){
String strSize=(String) comboxSize.getSelectedItem();
int size=Integer.parseInt(strSize);
int i=0,n=comboxSize.getItemCount();
while(i<n){
int isSize=Integer.parseInt((String) comboxSize.getItemAt(i));
if(size>isSize){
i++;
}else if(size==isSize){
return;
}else{
break;
}

}
comboxSize.insertItemAt(strSize, i);
}
if(e.getSource() instanceof JMenuItem|| e.getSource() instanceof JRadioButton){

if(e.getActionCommand().equalsIgnoreCase("red")||e.getActionCommand().equalsIgnoreCase("green")||e.getActionCommand().equalsIgnoreCase("blue")){
changeColor(e);
}

if(e.getActionCommand().equals("exit")){
System.exit(0);
}
if(e.getActionCommand().equalsIgnoreCase("bold")||e.getActionCommand().equalsIgnoreCase("italic")){

int style = changleStyle(e);
   font = new Font(text.getFont().getName(), style, text.getFont().getSize());
   text.setFont(font);
}

if(e.getActionCommand().equalsIgnoreCase("cut")){
text.cut();
}
if(e.getActionCommand().equalsIgnoreCase("copy")){
text.copy();
}
if(e.getActionCommand().equalsIgnoreCase("paste")){
text.paste();
}

}

//做菜单字体与工具条中字体形式的同步

}

private void changeColor(ActionEvent e) {
Color color=null;
if(e.getActionCommand().equalsIgnoreCase("red")){
color=new Color(255,0,0);
radioColor[0].setSelected(radioMenuItem[0].isSelected());
radioMenuItem[0].setSelected(radioColor[0].isSelected());
}
if(e.getActionCommand().equalsIgnoreCase("green")){
color=new Color(0,255,0);
radioColor[1].setSelected(radioMenuItem[1].isSelected());
radioMenuItem[1].setSelected(radioColor[1].isSelected());
}
if(e.getActionCommand().equalsIgnoreCase("blue")){
color=new Color(0,0,255);
radioColor[2].setSelected(radioMenuItem[2].isSelected());
radioMenuItem[2].setSelected(radioColor[2].isSelected());

}

text.setForeground(color);
}

private int changleStyle(ActionEvent e) {

int style = text.getFont().getStyle();

if (e.getActionCommand().equalsIgnoreCase("bold") ) {
style = style ^ 1;
}

if (e.getActionCommand().equalsIgnoreCase("italic") ) {
style = style ^ 2;

}
common(style);
return style;
}

private void common(int style) {
boolean sta1,sta2;
sta1=((style & 1)==1);
sta2=((style & 2)==2);
chkMenuItems[0].setSelected(sta1);
chkBold.setSelected(sta1);
chkMenuItems[1].setSelected(sta2);
chkItalic.setSelected(sta2);

}

@Override
public void mouseClicked(MouseEvent e) {
if(e.getModifiers()==MouseEvent.BUTTON3_MASK){
popMenu.show(text, e.getX(), e.getY());
}
}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}
public static void main(String[] args) {
new EditorJFrame();
}

}

java课程设计-文本编辑器相关推荐

  1. java 课程设计文本编辑器,JAVA课程设计--文本编辑器

    JAVA课程设计--文本编辑器 Java 语言课程期末作业 1 Java 语言课程期末作业 题 目 第 8 题,文本编辑器 学 院 计算机学院 专 业 计算机科学与技术 班 别 学 号 姓 名 201 ...

  2. c语言课程设计文本编辑器实验报告6,C课程设计简易文本编辑器.doc

    C课程设计简易文本编辑器 目录 第一章 课程设计目的和要求1 1.1课程设计的目1 1.2 基本要求1 第二章 课程设计任务内容2 2.1 设计背景2 2.2简易文本编辑器设计内容2 第三章 详细设计 ...

  3. Java课程设计-日历记事本

    #Java课程设计-日历记事本 ##日历记事本 要求:带有日程提醒功能的日历(数据库可采用Access.SQL Server或者MySQL). (1)显示信息:用户可以向前翻页查询前一个月的日期,也可 ...

  4. JAVA课程设计——“小羊吃蓝莓”小游戏

    JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...

  5. 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc

    java课程设计----计算器小程序报告.doc #####学院JAVA语言课程设计报告小程序计算器系统管理班级:#######姓名:#####指导老师:###时间:2012年6月25日至6月29日2 ...

  6. Java课程设计报告--绩效考核信息管理系统

     Java课程设计报告 题目      绩效考核信息管理系统    学生姓名         学    号                   院    系        年级专业计算机科学与技术 班 ...

  7. java课程设计打字训练测试软件_打字训练测试软件-Java课程设计

    打字训练测试软件-Java课程设计 <程序设计实践>题目: 打字训练测试软件 学校:陕西工业学院 学院:信息学院 班级:信管 12-2 学号: 201213156619 姓名:刘克豪 20 ...

  8. java学籍管理系统 课程设计,Java课程设计---学生学籍管理系统

    Java课程设计---学生学籍管理系统 设计报告设计报告 课题名称学生学籍管理系统 学院 专业班级计算机应用技术 091 学号 学生 指导教师 2011 年 7 月 7 日 1 学生 指导教师 课题名 ...

  9. 秒表计时器——Java基础练手项目(Java课程设计)

    前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT).鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各 ...

最新文章

  1. 一个小小的知识点,关于强制类型转换
  2. Java如何连接openvas_gas: chinese Gui for openvAS(GAS)
  3. python的数据结构包括那些_python算法与数据结构-什么是数据结构
  4. 2018级软件秋季总结
  5. comparator比较器用法_电压跟随器的这些点,确定都懂了吗?如果设计成同相端追随反向端会怎样? #运放...
  6. 为什么使用php工厂模式,PHP 工厂模式使用方法
  7. 十天学会单片机和c语言编程》,求十天学会单片机和C语言编程 ??
  8. Docker 安装(使用阿里源)
  9. 程序员眼中的中国传统文化-王阳明《传习录》16
  10. 【Knowledge】Apex callout 与外部service的统合
  11. oracle批次处理数据_如何加速Oracle大批量数据处理
  12. 超详细的Spring Boot教程,搞定面试官!
  13. LocalDateTime计算时间差
  14. 2022年最火副业;海外抖音 (TikTok) 搬运视频,一周赚一个月工资。
  15. Java:利用接口实现打印机案例(墨盒有彩色和黑白色,纸张有A4纸和B5纸)
  16. 《天外世界》游戏体验报告
  17. 【十八掌●内功篇】第六掌:YARN之YARN资源调度器
  18. Failed to get schema version. Underlying cause: Failed to create database metastore_db
  19. 加密相册、保险箱App打开就闪退、点击提示App Store不提供应用、需要更新才能使用的解决方案
  20. Python判断奇偶的方法

热门文章

  1. 微博分享按钮 网站设置分享到微博 网站怎么添加微博分享按钮
  2. MongoDB数据库简介
  3. sony直营店可以享受到什么体验和服务?
  4. pandas——数据移位、数据转换、数据合并、数据导出和日期数据的处理,时间序列等
  5. Graph Theory 离散数学第六章
  6. 数据结构__图书管理系统(C语言)
  7. CDSS十年回望及未来展望
  8. grads环境变量的设置
  9. 北理工C语言乐学46【猜数字】
  10. Android黑白照片上色APP,Colorize上色APP