和文本框有关的练习(JTextArea和document)

来源:互联网 发布:龙珠直播软件 编辑:程序博客网 时间:2024/06/05 16:33

本来帮朋友做一个课设,中途在考虑UI界面数据的获取时遇到了一些问题,于是花了点时间学习了一下。
本次主要涉及三个类:JTextArea、PlainDocument和正则表达式。
在swing里面,有几个和文本相关的类,这次我使用JTextArea,而在研究这个文本的一些技巧的时候,发现要用到PlainDocument这个类,这个类网上资料还真不多,只能自己琢磨了一番。正则表达式就是复习一下,好久没用了。

遇到的问题是这样的:比如说我想要限制文本框中一些字符的输入,比如我不允许输入‘0’,这个问题我弄了好久,开始用按键监听,发现怎样都不能很好的解决(顺带了解了一下监听事件的原理是类似于观察者模式,之前以为是多线程呢)。后来查资料才发现要用上PlainDocument,就是用JTextArea(Document doc) 这个构造函数,这样就可以把这两个东西关联起来(不懂其中原理)。然后就能实现了。

我手上的这本中文api实在解释的很笼统,所以很多函数功能根本理解不了,连测试都不知道该怎么测试。摸索了一天多,把一些理解了的函数记录一下:
类JTextArea:
1、构造函数(1):JTextArea(Document doc):构造新的 JTextArea,使其具有给定的文档模型,所有其他参数均默认为 (null, 0, 0)。这个构造函数好处在于可以使用PlainDocument这个类中的方法来对文本进行限制,其实JTextArea本身并没有文本相关的功能,他是依托于Document接口下实现的类来完成的,它只不过把document中的内容在UI界面上显示出来(个人理解,未经证实)
2、构造函数(2):JTextArea(Document doc, String text, int rows, int columns) 其实和第一个一样,只是多了一些参数设置,上面的只是把这些参数都默认了,就是初始化显示一个text,然后设置行数和列数,0,0就是最大化。
几个我理解了但不通俗易懂的函数:
1、getLineEndOffset(int line):line>=0;返回这一行的字符数
2、getLineOfOffset(int offset) :返回第“offset”个字符所在的行
3、getLineStartOffset(int line):返回该行第一个字符所在的列,有点那么,那不都是第一列吗,有可能是改变了换行策略后就不一样了,不重要,不理先。
还有一些不理解或者很好理解的,就不列举了
~~~~~~~~~~~~
JTextComponent:JTextArea的父类
这个类我就摸索出一个概念:插入符,就是光标的意思,有以下几个函数:
1、getCaretPosition() :返回当前光标在第几个字符上
2、setCaretPosition(int position) :让光标指向第“position”个字符
这个类看起来就很强大,里面有一些很复杂的函数,看不懂,我这次只用到这两个。
~~~~~~~~~~~
类AbstractDocument:PlainDocument的父类
直接介绍父类,这是所有文档了的基础,PlainDocument本身并没有什么函数。
1、insertString(int offs, String str, AttributeSet a) 最重要的方法之一:当你向文本框里输入东西的时候,就是调用这个类把内容添加到文档中,然后再显示在文本框中的。参数含义:offs输入东西的位置;str要输入的内容;a:不懂是干嘛的(因为目前不需要去理解它,就没理)。
2、remove(int offs, int len) 最重要的方法之一:当你按下删除键时调用这个函数从文档中删除。参数含义:offs,删除内容的起始位置;len:删除的长度。
3、getText(int offset, int length) 最重要的方法之一:获取一段文本内容,参数和上面差不多。

起始我对上面内容只是了解了一点皮毛,因为我用得不多,就没必要花时间去研究了。

下面看代码:

main函数

public class Main {    public static void main(String[] args) {        window window=new window();    }}

window类

import javax.swing.JFrame;import javax.swing.JTextArea;public class window  {    private JFrame frame;    JTextArea text = new JTextArea(new document(),">>",0,0);//创建文本框    public window(){//构造函数        initialize();        frame.setVisible(true);    }    private void initialize() {初始化类        frame = new JFrame();        frame.setBounds(100, 100, 450, 300);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           text.setBounds(0, 0, 434, 261);        text.setColumns(0);        text.setCaretPosition(2);//设置光标初始位置,不然默认是0        frame.getContentPane().add(text);    }}

模板匹配类

import java.util.regex.Matcher;import java.util.regex.Pattern;public class ReadTextArea {    public static boolean pipei(String str){         String regEx="^ *(int|float|double|long) +[a-z]+\\d* *= *\\d+(\\.\\d)?\\d*";//正则表达式         Pattern pattern = Pattern.compile(regEx);         Matcher matcher = pattern.matcher(str);         return matcher.matches();    }}

document类

import javax.swing.text.AttributeSet;import javax.swing.text.BadLocationException;import javax.swing.text.PlainDocument;public class document extends PlainDocument {//继承    int sign=2;//用于记录最后一句话的起点,这里的一句话以";"分割    //重写insertString方法,加入一些限制    public void insertString(int offset, String s, AttributeSet as) throws BadLocationException {        if(s.equals(";")) {//分号作为每句话的分割符,所以很特别            super.insertString(offset,s,as);//调用父类的该方法进行输入            if(ReadTextArea.pipei(getText(sign, offset-sign)))//对最后一句话进行模板匹配                super.insertString(offset+1,"//语法正确",as);            else                super.insertString(offset+1,"//语法错误",as);            super.insertString(offset+7,"\n>>",as);//每输入分号自动换行            sign=offset+10;        }        else if(getText(offset, 1).equals(">"))//不允许在">>"左边输入内容            return;         else{            super.insertString(offset,s,as);        }    }    //重写remove方法    public void remove(int offs, int len){        try {            if(getText(offs, len).equals(">"))//不允许删除">"                return;            super.remove(offs, len);        } catch (BadLocationException e1) {            e1.printStackTrace();        }    }}

其实内容不多,很好理解。

展示一下效果图:
这里写图片描述

就是用正则表达式确定一个语法规则,然后判断是否符合。
其实我是想模仿matlab的界面做一个简单的编译器(只有加减乘除),但是我没学编译原理,只好放弃。我现在解决的是从UI界面获取到数据的方法并对文本输入进行一定限制。

原创粉丝点击