在Java学习过程中需要积累下来的一些编程思路和方法——关于TextArea的用法和内部元素编辑
由编写计算器中使用TextArea遇到问题而产生的思考
关于TextArea的问题,是在运用Java编写仿照win10自带计算器(也就是下面图片所显示的)时出现的。大家都知道我们一般用的计算器数字都是从右至左输入的,换句话说,我们输入的位数越多,对齐部位都在最右边。但是在Java中,使用JTextArea创建的文本域对象默认是左对齐(下图中的程序初期截图中正是如此),因此在这里遇到疑问,就需要仔细学习一下TextArea的使用方法。
在百度搜索Java TextArea会看到这样一篇博文 http://blog.sina.com.cn/s/blog_63cefe150100gtek.html
以下内容转自上面这个链接;
public void insert(String s,int x)向文本区指定的位置x(文本区开始处字符的个数)插入指定文本s。
public void replaceRange(String s,int start,int end):用字符串s替换从指定位置start开始到指定位置end结束的文本。
首先摘录了两个实用性较高的方法备用。
下面进入正题,由于win10自带的计算器功能较为强大,除了最基本的加减乘除求平方根号以及内存存储外,还有进制转换汇率转换等功能,因此我的思路是先实现加减乘除求平方根号这些基本的数学运算和计算器的基本清除功能。在实现了这些功能后,我发现如果我输入的数字过多,后输入的数字会不显示在屏幕中,因为win10的计算器时右对齐的,也就是个位永远在最右边不动,而我们先输入的最高位会依次向左移动,而这个功能我是不会实现的。于是我开始求助。
我发现了这样一个方法.setAlignmentX(float a),但发现这个方法是调整组件在swing中的对齐方式,并不是调整文本域中的文本对齐。查看了很多帖子和博文也没有找到解决方法,很是苦恼。不如就推翻重头再来,学习一遍有关文本输入的相关组件
Java中我已知的可以用于文本输入输出的有TextArea,TextField,TextPane,Table这些组件,下面是先对每个组件的单独解释,紧接着会有横向比对
1.TextField
TextField是一个比较基础的组件,我认为他最大的特点之一就是他只能显示单行的文本,
因此你看到的很多账号密码输入都可以使用它,因为不需要换行。
但是缺点也在于无法实现多行文本的显示在GUI中。以下是它的构造方法和常用方法
//一般我们这样实例一个TextField对象
JTextField TextField = new JTextField(String text, int columns);
//括号中的两个参数分别代表了TextField中初始的文本和它的初始宽度(能容纳文本的数//量)
//以下是对TextField操作的基本方法
int getColumns()
//获取此文本字段中的列数
char getEchoChar()
//获取用于回显的字符。
void setColumns(int columns)
//设置此文本字段中的列数。
void setEchoChar(char c)
//设置此文本字段的回显字符。
void setText(String t)
//将此文本组件显示的文本设置为指定文本
//当然它适用很多常用的方法如setFont(),setOpaque(),setBackgrang()和setBounds()等
值得注意的是,由于通过数字键盘向计算器输入的时候使用了append函数,但发现append函数无法向TextField中添加指定的字符串。
我认为这是他的局限性之一。但不可否认他在用户登录等类似的输入环境中优势很大。
2.TextArea
相较TextField而言,TextArea可以输入多行代码。也就是说输入的文本可以多行显示,但似乎输入的文本是伪换行,但的确用户可以通过滚动条查看超过输入宽度的文本。
//实例化一个TextArea组件,参数分别代表文本域中的初始文本,文本域的高度,文本域的宽度
JTextArea textArea = new JTextArea(String text, int rows, int columns);
//设置文本域的换行
setLineWrap(true);
//向文本域的末尾添加给定文本
append(String text);
//以及上述TextField可以使用的用来设置组件属性的函数TextArea均可使用,除setAlignmentX(float a)
//在指定位置x插入字符串s
insert(String s,int x);
//用字符串s替换从start位置开始到end位置结束的内容
replaceRange(String s, int start, int end);
//定义键盘是否可以向文本域输入文本
setEditable(Boolean b)
3.TextPane
通过了解,TextPane是一个富文本组件,是一个可以编辑和显示html,rtf和普通文本。那么我们这里如果用它似乎有点大材小用了。不过他的功能还是很强大的。我们这里先不做讨论。
那么我们是是否解决文本的对齐方式了呢?
答案是没有,目前得出的结论是TextArea无法设置文本为右对齐。具体win10的计算器是如何实现的呢?应该是使用了TextField来承载文本吧。但是本程序我们为什么不使用TextField;第一是上面提到过的无法使用append()方法、其二是我们采用过长数字换行显示的的方法以便使用者查阅。这都是TextField无法实现的。
结尾
也当做记录,下面是用来限制文本域输入内容的方法,主题思想是编写一个类,在文本域实例化后对其进行限制,具体可控元素分别是输入文本长度和输入文本内容。
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class NumberTextField extends PlainDocument {
private int limit = -1;
private String allowCharAsString = null;
public NumberTextField(){
super();
}
public NumberTextField(int limi){
super();
this.limit= limi;
}
public void insertString(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (str == null) {
return;
}
if (allowCharAsString != null && str.length() == 1) {
if (allowCharAsString.indexOf(str) == -1) {
return;
}
}
char[] charVal = str.toCharArray();
String strOldValue = getText(0, getLength());
byte[] tmp = strOldValue.getBytes();
if (limit != -1 && (tmp.length + charVal.length > limit)) {
return;
}
super.insertString(offset, str, attr);
}
public void setAllowChar(String str){
allowCharAsString = str;
}
}
下面为在具体类中的实现,这里的screen1这个TextArea就只能输入长度最长为16内容仅限于由0到9以及-和E这些字符组成的内容了。