和文本框有关的练习(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界面获取到数据的方法并对文本输入进行一定限制。
- 和文本框有关的练习(JTextArea和document)
- 文本框控件JTextField和JTextArea的使用
- JTextArea和NumberFOrmat的用法
- 文本框(JTextField)和文本域(JTextArea)的使用详解
- 【HASH】有关哈希表的练习和研究
- JAVA JTextField 和JTextArea的一般方法
- JText,JTextArea和JScrollBar(滑块)
- JTextArea 和 JScrollPane
- JTextArea和JScrollPane
- 实现文本的复制和粘贴、文本的撤销和恢复(Swing JTextArea)
- java的JTextArea的滚动条和自动换行
- java 在jtextarea(文本框)里显示拖动进来文件的路径
- java 在jtextarea(文本框)里显示拖动进来文件的路径
- 有关于CSS的面试题和练习
- 具备复制粘贴功能的JTextField和JTextArea
- JTextArea append() 方法的每次循环不能正常显示的有关问题(刷新)
- Swing组件的使用---文本框(JTextField)与文本区(JTextArea)
- document和document.body的区别
- mycat中间件(五)mycat配置文件之schema.xml 第一部分
- 第六次C++作业
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- 写给迷茫的程序员
- vlayout源码思路解析
- 和文本框有关的练习(JTextArea和document)
- spring 加载自定义配置
- 02_插入算法
- JAVA设计模式-策略模式应用实例
- 特长生模拟——遭遇战
- 爱测未来开发-InfluxDB使用
- leetcode palindrome-number(判断一个数字是否是回文)
- 共享手机 馅饼还是陷阱
- Http请求中Content-Type讲解以及在Spring MVC中的应用