`

一个JTextArea的重构

阅读更多
package fr.itris.glips.svgeditor.properties.database;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
 

class MyTextArea extends JTextArea {

private JPopupMenu pop = null; // 弹出菜单
JCheckBoxMenuItem lock = null;
private JMenuItem clear = null; // 三个功能菜单
StringBuffer buf = new StringBuffer();
boolean locked = false;
private static final int MAX_LINE_NUM=2000;
public MyTextArea() {
super();
this.setEnabled(false);
this.setEditable(true);
pop = new JPopupMenu();
lock = new JCheckBoxMenuItem("锁定");
lock.setSelected(locked);
lock.setName("锁定");
pop.add(lock);
pop.add(clear = new JMenuItem("清空"));

this.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (MyTextArea.this.getLineCount() >= MAX_LINE_NUM) {
int end = 0;
try {
end = MyTextArea.this.getLineEndOffset(MAX_LINE_NUM);
} catch (Exception e) {
}
MyTextArea.this.replaceRange("", 0, end);
}
MyTextArea.this.setCaretPosition(MyTextArea.this.getText().length());
}
});
}

public void removeUpdate(DocumentEvent evt) {
}

public void changedUpdate(DocumentEvent evt) {
}
});
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {

pop.show(MyTextArea.this, e.getX(), e.getY());
}
}
});
PopupMenuListener popupMenuListener=new PopupMenuListener();
lock.addChangeListener(new LockedChangeListener());
clear.addActionListener(popupMenuListener);

lock.setAccelerator(KeyStroke.getKeyStroke('L',
InputEvent.CTRL_MASK));
clear.setAccelerator(KeyStroke.getKeyStroke('C',
InputEvent.CTRL_MASK));


}

@Override
public void append(String str) {
synchronized (this) {
// ++lineNo + " 、" 
String line = str + "\r\n";
if (!locked) {
super.append(line);
} else {
buf.append(line);
}
}

}


public synchronized void lock() {
if(!locked){
locked = true;
}
}

public synchronized void unLock() {
if(locked){
locked = false;
if (buf.length() > 0) {
this.append(buf.toString());
buf.delete(0, buf.length());
}
}

}

public synchronized void setLock(boolean locked) {
if (locked) {
lock();
} else {
unLock();
}

}
public synchronized void clear(){
this.setText("");
}

private class LockedChangeListener implements ChangeListener {
public void stateChanged(ChangeEvent event) {
setLock(lock.isSelected());
}
}

private class PopupMenuListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str = e.getActionCommand();
if (str.equals(clear.getText())) {  
clear();
}
}
}
 
}
分享到:
评论

相关推荐

    基于Java swing组件实现简易计算器

    4. JTextArea组件:JTextArea是Java swing组件中的一种文本域组件,用于创建一个文本输入框。例如:`JTextArea ta = new JTextArea();` 5. GridLayout布局管理器:GridLayout是一种网络式的布局管理器,将容器空间...

    基于java开发一个简单的图书管理系统Swing源码.zip

    【标题】"基于Java开发一个简单的图书管理系统Swing源码.zip"揭示了这是一个使用Java Swing库构建的图书管理系统的源代码。Swing是Java提供的一个图形用户界面(GUI)工具包,它允许开发者创建丰富的桌面应用程序。...

    Eclipse编写的Java记事本

    【标题】"Eclipse编写的Java记事本"是一个基于Java编程语言开发的文本编辑器,主要用于学习和实践Java编程。Eclipse是一个流行的开源集成开发环境(IDE),它为Java开发者提供了丰富的功能,如代码编辑、调试、构建...

    TankWar.rar

    总的来说,"TankWar.rar"项目不仅是一个有趣的游戏,也是一个丰富的Java学习资源。它包含了Java基础、图形绘制、事件处理、数据结构和算法等多个方面的知识,是初学者提升技能的理想实践。通过研究并重构这个游戏,...

    java仿windows计算器源代码

    Java仿Windows计算器是一个基于Java Swing和AWT库开发的图形用户界面(GUI)应用程序,用于实现基本的数学计算功能,类似于我们常见的Windows操作系统中的计算器。这个项目作为一个课程设计任务,旨在帮助学生熟悉...

    java学生选课系统

    【Java学生选课系统】是一个非常适合初学者进行实践的项目,它主要展示了如何利用Java编程语言构建一个图形用户界面(GUI)应用,用于模拟实际学校中的选课流程。这个系统虽然简单,但却涵盖了多个关键的Java技术和...

    JAVA 记事本 源码

    【JAVA 记事本 源码】是一个基础的Java应用程序,它实现了类似Windows系统中的“记事本”功能,但可能不包含所有标准记事本应用具备的功能。这个源码是一个很好的学习材料,特别是对于初学者,可以深入理解Java GUI...

    JAVa记事本源代码

    Java记事本源代码是一个基于JAVA编程语言实现的简单文本编辑器。这个项目为初学者提供了深入了解Java GUI(图形用户界面)编程的机会,同时也展示了如何使用Swing库来创建一个功能丰富的应用程序。以下是对该源代码...

    java swing学生考试系统

    Java Swing学生考试系统是一款基于Java桌面应用开发的项目,它充分利用了面向对象编程的思想和技术,为学生提供了一个模拟考试的平台。在这个系统中,学生可以进行自我测试,提高学习效果,而开发者则通过这个项目...

    swing小程序

    在IntelliJ IDEA中使用Swing,你需要先创建一个新的Java项目,然后添加Swing的支持。在项目结构设置中,可以选择"JavaFX/Swing Application"模板来快速搭建Swing环境。接着,可以使用IDE的内置GUI设计器来可视化地...

    java 简单记事本

    - **打开文件**:使用`JFileChooser`类,允许用户选择一个文件打开,然后通过`BufferedReader`读取文件内容到内存。 - **保存/另存为**:使用`BufferedWriter`类将内存中的文本写入文件。另存为功能会创建新的`...

    java课程设计 日历记事本 内含源代码 打包发布

    这个“日历记事本”项目就是一个典型的案例,它涉及到多个Java技术领域,包括图形用户界面(GUI)、事件处理、数据存储以及日期时间处理等。通过这个项目,学生可以深入理解面向对象编程的原理,并且掌握Java Swing...

    swing可视化开发插件.rar

    Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分,由Sun Microsystems在1990年代末期开发。Swing提供了一套丰富的组件,用于创建桌面应用程序,包括按钮、文本框、...

    Swing可视化插件(Eclipse)

    在设计界面中,开发者可以看到一个面板,左侧是组件库,包含各种Swing组件,如JButton、JLabel、JTextArea等。只需简单地将所需的组件从组件库拖放到右侧的设计画布上,就可以开始构建UI。每个组件都有自己的属性,...

    记事本源码(完整)

    【标题】"记事本源码(完整)"所涉及的知识点主要集中在Java编程语言上,特别是关于构建一个简单的文本编辑器,也就是我们常见的“记事本”程序。在这个项目中,开发者分享了实现记事本所有功能的源代码,并鼓励其他...

    jbuilder的酒店管理系统

    本文将深入探讨一个由JBuilder开发的酒店管理系统,旨在帮助初学者了解如何利用JBuilder这一强大的集成开发环境(IDE)构建此类系统。 JBuilder是一款由Borland公司(现为Embarcadero Technologies)推出的Java开发...

    TextEditor.zip

    《记事本源代码分析——基于Java与...此外,对于初学者来说,这是一个很好的实践项目,能够帮助他们将理论知识转化为实际操作,提升编程技能。对于经验丰富的开发者,此项目可作为参考,了解不同的设计模式和最佳实践。

    ToDoList:开发一个提供待办事项功能的应用程序

    在IT行业中,开发一个待办事项(To-Do List)应用程序是一种常见的练习,它可以帮助我们理解和实践基础的软件工程概念,尤其是对于初学者而言。在这个项目中,我们将使用Java编程语言来实现。Java以其跨平台的特性,...

    第七次作业解析——日志文件程序

    日志文件程序是一个用于记录日常学习笔记的应用,它基于Java编程语言,使用图形用户界面(GUI)来实现。该程序的核心功能是每天向同一个文本文件中追加新的学习内容,而不是覆盖原有信息。这涉及到Java中的输入/输出(I...

    JavaProjects

    【JavaProjects】是一个涵盖基础Java开发的项目集合,主要包含了两个实用程序:Calculator(计算器)和记事本。这两个项目都是学习和理解Java编程语言核心概念的绝佳实践案例。通过深入解析这些项目,我们可以深入...

Global site tag (gtag.js) - Google Analytics