`
xyheqhd888
  • 浏览: 409301 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

专题制作--文字编辑器(逻辑实现部分)

阅读更多

  1.  事件处理:

   在Java中事件以具体的对象来表示,使用者的相关动作会由JVM建立相对应的事件,用以描述事件来源、发生了什么事情以及相关的消息,需要通过捕捉对应的事件,以进行对应的操作来完成应用程序的功能。

2.  Java事件模型:

   Java对事件的处理采用委托事件模型(Delegation Event Model),在这个模型下,事件被送到对应的组件,而组件会将事件传播至每个事件监听器(Event Listener),事件监听器中定义了与不同事件相对应的事件处理者(Event Handler),只有向组件注册的事件监听器才能收到事件。通过这种模型,事件发生时是委托事件处理者进行处理,事件处理者与组件的设计可以分别独立。

     具体来说,事件监听器实现了java.util.EventListener接口,不过这个接口只是个标示接口(Marker Interface)。其中并没有规定必须实现的方法。对于J2SE窗口程序而言,相对应的事件监听器主要位于java.awt.eventjavax.swing.event包之下,它们都是EventListener的子接口。

3.  文字编辑器的事件处理:

    以菜单项被单击时的事件处理来说,要实现java.awt.event.ActionListener接口。例如:

//打开"文件"菜单项的事件处理
menuOpen.addActionListener
{
   new ActionListener()
   {
        public void actionPerformed(ActionEvent e)
        {
              openFile(); 
        }
   }
}

      这时采取的是匿名类的方式实现了ActionListener接口,该接口定义了actionPerformed()方法,这个方法就是事件处理者。 您要在当中实现菜单项被单击时所要进行的处理。当菜单项被单击时会发出ActionEvent。这个事件会传递给曾向菜单项组件注册的事件监听器,并调用对应的事件处理者。向菜单项组件注册事件监听器的方式是使用addActionListener()方法。

      以上示范的是JMenuItem的事件处理,至于JTextArea的事件方面,由于需求中主要是针对编辑文字时的事件作处理,编辑文字主要是键盘操作,因而会发生KeyEvent事件。可以实现java.awt.event.KeyListener接口来设置相关的事件处理,这个接口有3个方法(事件处理者)必须实现:

package ysu.hxy;

public interface KeyListener
{
     public void keyPressed(KeyEvent e)
     public void keyReleased(KeyEvent e)
     public void keyTyped(KeyEvent e)
}

 对于这个将要制作的文字编辑器而言,您所感兴趣的主要是键盘被按下进行文字编辑时的事件处理,所以可以仅实现keyTyped()方法,另两个方法在实现时保持空白即可,也可以继承java.awt.event.KeyAdapter。KeyAdapter类实现KeyListener接口,而对3个方法实现时仅保持空白,通过继承KeyAdapter,可以用仅重新定义keyTyped()方法,而不用对另两个方法也进行实现,编写时较为方便且程序代码看来也会比较简洁。可以使用JTextArea的addKeyListener()方法加入事件监听器,例如:

//编辑区键盘事件 
textArea.addKeyListener(
   new KeyAdapter()  
   {
      public void keyTyped(KeyEvent e)
      {
           processTextArea();
      }
   }
);

 文字编辑区也会有鼠标事件,也就是使用鼠标按右键显示快捷菜单,以执行剪切、复制、粘贴的动作来进行文字编辑。鼠标事件监听器是实现java.awt.event.MouseListener接口,其中有5个方法必须实现,如果觉得麻烦,可以继承java.awt.event.MouseAdapter,它实现了MouseListener接口,但实现方法时保持空白,也可以在继承MouseAdapter后,对感兴趣的事件处理者进行实现。例如:

//编辑区鼠标事件
textArea.addMouseListener
{
   new MouseAdapter() 
   {
        public void mouseReleased(MouseEvent e)
        {
             if(e.getButton() == MouseEvent.BUTTON3)
                 popUpMenu.show(editMenu,e.getX(),e.getY());
        }

        public void mouseClicked(MouseEvent e)
        {
             if(e.getButton() == MouseEvent.BUTTON1)
                 popUpMenu.setVisible(false);
        }
   }
}

 鼠标处理者接受的是MouseEvent,您可以使用getButton()方法取得一个常数,表示按下的是那个鼠标键,MouseEvent.Button1是指按下鼠标左键,MouseEvent.Button3表示按下鼠标右键,您使用JTextArea的addMouseListener()方法加入监听器。程序片段中的popUpMenu参考至javax.swing.JPopupMenu的实例,这个实例可用编辑菜单直接取得。例如:

JPopupMenu popUpMenu = editMenu.getPopupMenu();

还有一个事件是您要处理的,就是单击窗口右上角的X按钮时,希望动作与单击菜单中“关闭”具有相同的行为,所以删去原来程序中的这行:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

并且改为自行实现java.awt.event.WindowListener。这个接口中有7个方法必须实现,如果觉得麻烦,可以继承实现了此接口的java.awt.event.WindowAdapter。然后对感兴趣的方法进行实现。例如:

//单击窗口关闭按钮事件处理
addWindowListener(
     new WindowAdapter() 
     {
         public void windowClosing(WindowEvent e)
         {
                closeFile();
         }
     }
);

 要向JFrame注册WindowListener,可以使用addWindowListener()方法。windowClosing()方法会在单击X按钮后,窗口真正关闭前执行。 以下是将以上说明实际套用至文字编辑器实现中的程序代码:

package ysu.hxy;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
//import java.awt.event.InputEvent;
//import java.awt.event.KeyEvent;
import java.awt.event.*;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;

import javax.swing.JPopupMenu;

import javax.swing. JOptionPane;


public class JNotePadUI extends JFrame
{
    private JMenuItem menuOpen;
	private JMenuItem menuSave;
	private JMenuItem menuSaveAs;
	private JMenuItem menuClose;

	private JMenu editMenu;
	private JMenuItem menuCut;
	private JMenuItem menuPaste;
	private JMenuItem menuCopy;

	private JMenuItem menuAbout;
	private JTextArea textArea;
	private JPopupMenu popUpMenu;

	public JNotePadUI()
	{
		super("新建文本文件");
		setUpUIComponent();
		setUpEventListener();
		setVisible(true);
	}

	private void setUpUIComponent()
	{
		setSize(640,480);
          
		//菜单栏
		JMenuBar menuBar = new JMenuBar();

		//设置"文件"菜单 
		JMenu fileMenu = new JMenu("文件");
		menuOpen = new JMenuItem("打开");
		//快捷键设置
		menuOpen.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
		menuSave = new JMenuItem("保存");
		menuSave.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));

		menuSaveAs = new JMenuItem("另存为");
		
		menuClose = new JMenuItem("关闭");
		menuClose.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_Q,InputEvent.CTRL_MASK));

		fileMenu.add(menuOpen);
		//添加分隔线
		fileMenu.addSeparator();
		fileMenu.add(menuSave);
		fileMenu.add(menuSaveAs);
		//添加分隔线
		fileMenu.addSeparator();
		fileMenu.add(menuClose);

		//设置"编辑"菜单
		JMenu editMenu = new JMenu("编辑");
		menuCut = new JMenuItem("剪切");
		menuCut.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_X,
			InputEvent.CTRL_MASK));

		menuCopy = new JMenuItem("复制");
		menuCopy.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_C,
			InputEvent.CTRL_MASK));
		
		menuPaste = new JMenuItem("粘贴");
		menuCopy.setAccelerator(
			KeyStroke.getKeyStroke(KeyEvent.VK_V,
			InputEvent.CTRL_MASK));
		
		editMenu.add(menuCut);
		editMenu.add(menuCopy);
		editMenu.add(menuPaste);

		//设置"关于"菜单
		JMenu aboutMenu = new JMenu("关于");
		menuAbout = new JMenuItem("关于JNotePad");
		aboutMenu.add(menuAbout);

		menuBar.add(fileMenu);
		menuBar.add(editMenu);
		menuBar.add(aboutMenu);

		//设置菜单栏
		setJMenuBar(menuBar);

		//文字编辑区域
		textArea = new JTextArea();
		textArea.setFont(new Font("宋体",Font.PLAIN,16));
		textArea.setLineWrap(true);
		JScrollPane panel = new JScrollPane(textArea,
			ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
			ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

		Container contentPane = getContentPane();
		contentPane.add(panel,BorderLayout.CENTER);

		//状态栏
		JLabel stateBar = new JLabel("未修改");
		stateBar.setHorizontalAlignment(SwingConstants.LEFT);
		stateBar.setBorder(BorderFactory.createEtchedBorder());
		contentPane.add(stateBar,BorderLayout.SOUTH);

		popUpMenu = editMenu.getPopupMenu();
	}

	private void setUpEventListener() {
        // 按下窗口关闭钮事件处理
        addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent e) { 
                    closeFile();
                }
            }
        );
        
        // 菜单 - 打开
        menuOpen.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    openFile();
                }
            }
        );

        // 菜单 - 保存
        menuSave.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    saveFile();
                }
            }
        );

        // 菜单 - 另存为
        menuSaveAs.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    saveFileAs();
                }
            }
        );


        // 菜单 - 关闭文件
        menuClose.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    closeFile();
                }
            }
        );

        // 菜单 - 剪切
        menuCut.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    cut();
                }
            }
        );

        // 菜单 - 复制
        menuCopy.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    copy();
                }
            }
        );

        // 菜单 - 粘贴
        menuPaste.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    paste();
                }
            }
        );
        
        // 菜单 - 关于
        menuAbout.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // 显示对话框
                    JOptionPane.showOptionDialog(null, 
                        "程序名称:\n    JNotePad \n" + 
                        "程序设计:\n    良葛格\n" + 
                        "简介:\n    一个简单的文字编辑器\n" + 
                        "    可作为验收Java的实现对象\n" +
                        "    欢迎网友下载研究交流\n\n" +
                        "http://caterpillar.onlyfun.net/",
                        "关于JNotePad",
                        JOptionPane.DEFAULT_OPTION,
                        JOptionPane.INFORMATION_MESSAGE,
                        null, null, null);
                }
            }
        );      
        
        // 编辑区键盘事件
        textArea.addKeyListener(
            new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    processTextArea();
                }
            }
        );

        // 编辑区鼠标事件
        textArea.addMouseListener(
            new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if(e.getButton() == MouseEvent.BUTTON3)
                        popUpMenu.show(editMenu, e.getX(), e.getY());
                }
                
                public void mouseClicked(MouseEvent e) {
                    if(e.getButton() == MouseEvent.BUTTON1)
                        popUpMenu.setVisible(false);
                }
            }
        );        
    }


	private void openFile(){}
	private void saveFile(){}
	private void saveFileAs(){}
	private void closeFile(){}
	private void cut(){}
	private void copy(){}
	private void paste(){}
	private void processTextArea(){}

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

 

分享到:
评论

相关推荐

    Jp-word2.0简谱编辑器(可保存文件)

    关键是破解的版本,唯一网上可以保存制作后的简谱文件的音乐软件。JP-Word是一款简谱编辑软件,它的特点是体积小巧,输入便捷,所见即所得,音符的排版格式极为灵活,文本与乐谱可以混合排版,乐谱的字体可以有多种...

    FCKeditor-2.6.6 php HTML编辑器(附带图文安装)

    FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器。它志于轻量化,不需要太复杂的安装步骤即可使用。它可和PHP、JavaScript、ASP、ASP.NET、ColdFusion、Java、以及 ABAP等不同的编程语言相...

    cocos2d-x开发自己的编辑器

    4. 脚本编辑器:编写和调试 Lua 或 JavaScript 代码,实现游戏逻辑。 在《使用cocos2d-x开发各种编辑器》的文章中,可能涵盖了以下关键知识点: 1. UI组件与交互:使用cocos2d-x的UI库(如ccui)创建按钮、文本框、...

    ArcGIS专题图制作-人口空间分布专题图(详细技术文档与录屏)

    在本资源中,"ArcGIS专题图制作-人口空间分布专题图(详细技术文档与录屏)"提供了全面的学习材料,旨在帮助初学者掌握如何利用ArcGIS软件进行人口空间分布的专题图绘制。ArcGIS是一款强大的地理信息系统(GIS),...

    易语言超级编辑框依附-粘贴图片文字

    本话题聚焦于易语言中的一个特定功能:超级编辑框组件,以及如何在其中实现依附操作,即粘贴图片和文字。 超级编辑框是易语言提供的一种强大的文本编辑组件,它支持多种高级特性,如多行文本编辑、查找替换、字体...

    富文本编辑器(可以同时添加文字和图片)

    【富文本编辑器:结合文字与图片的编辑工具】 富文本编辑器是一种允许用户在文本中插入、编辑和格式化文字以及图片的交互式编辑工具。在移动应用开发,特别是Android平台,这样的编辑器功能非常实用,因为它为用户...

    TRS-wcm-DW模板编辑器选件

    DW模板编辑器选件作为这个系统的一部分,主要服务于TRS-wcm的模板设计环节。 在使用DW模板编辑器选件时,用户可以利用其丰富的编辑功能,轻松创建符合业务需求的HTML模板。这些模板可以预先设定好布局、样式和动态...

    C#简单文本编辑器处理文字

    这个文本编辑器能实现基本的文字输入、编辑、保存等功能,对于初学者来说,是一个很好的实践项目。 首先,我们需要了解C#的基础知识,包括类、对象、事件、控件以及文件I/O操作。C#中的WinForms或WPF框架提供了丰富...

    javascript经典特效---多种文字效果.rar

    JavaScript可以轻松实现文字的淡入淡出、滑动、闪烁等动画效果。通过修改元素的CSS属性,如`opacity`(透明度)和`transform`(变换),我们可以控制文字的显示和隐藏,或者使其在页面上移动。 2. 文字滚动: ...

    Eclipse 实现 Java 编辑器一(制作GUI界面)- 代码

    Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码 Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码 Eclipse 实现 Java 编辑器【一】(制作GUI界面)- 代码

    web编辑器开发

    Web编辑器通常被称为富文本编辑器,允许用户在网页上直接进行文字编辑、格式化、图片插入等操作,类似于我们在桌面环境下使用的Word或记事本。它们主要由前端界面和后端服务两部分组成,前端负责用户交互和数据处理...

    N++文本编辑器

    它的功能比 Windows 中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合当作编写电脑程序的编辑器。Notepad++ 不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的...

    乐都WIL编辑器3.2版 编辑传奇客户端图片

    2. 元数据编辑:除了图像本身,编辑器还允许用户修改与图像相关的数据,如位置信息、动画帧数、透明度设置等,这对于游戏逻辑的调整至关重要。 3. 文件导出与导入:用户可以将编辑后的图像导出为标准格式(如.png或...

    移动端强大的富文本编辑器richeditor-android

    H5端的富文本编辑器虽然常见,但在原生Android应用中,用户往往需要自行构建复杂的控件组合来实现类似功能。然而,有了`richeditor-android`,这一切变得简单而高效。这个开源框架专为Android平台设计,旨在提供与H5...

    富文本编辑器- wysiwyg

    3. **编辑器实现方式**: - 基于iframe的实现:将编辑区域放在一个独立的文档环境中,避免污染主页面样式。 - 使用contentEditable属性:直接将某个元素设置为可编辑,现代浏览器广泛支持。 4. **开源富文本编辑...

    Qt实现的一个文本编辑器

    【Qt实现的一个文本编辑器】 Qt是一个跨平台的C++应用程序开发框架,广泛用于创建图形用户界面和其他软件。它由The Qt Company维护,并且在开源社区中非常活跃。本项目利用Qt库实现了一个简单的文本编辑器,具备...

    c# 文字编辑器winform word 简单效果

    总的来说,这个“wordPADDemo”项目是一个简单的C# WinForm文字编辑器,它展示了如何利用.NET Framework提供的工具实现基本的文字编辑功能。通过学习和扩展这个示例,你可以更好地掌握C#编程、WinForm UI设计以及与...

    Delphi制作图片编辑器

    在图片编辑器的实现中,最核心的部分可能是图像处理功能。Delphi提供了GDI+和VCL图像处理组件,可以进行基本的图像加载、显示、旋转、裁剪、滤镜应用等操作。例如,`TImage`组件用于显示图像,`TBitmap`对象则可以...

    DLL文件编辑器

    DLL文件编辑器是一种专业工具,允许用户查看和修改这些文件的内容,以实现特定的目的,例如修复错误、优化性能或自定义软件行为。以下是对DLL编辑器及相关知识的详细解释: 1. **DLL文件的作用**: - 共享代码:...

    C语言编写的文本编辑器(实验报告,内附源码和解释)

    - **实验项目**:文本编辑器的实现 - **指导教师**:李莉丽 - **学生姓名**:陈德怀 - **学生学号**:2009053035 - **班级**:数媒一班 - **实验地点**:未指定 - **实验时间**:2010年月日点~点 - **实验成绩**:待...

Global site tag (gtag.js) - Google Analytics