Swing的输入框仍然分成两类:单行输入框和多行输入框,但与AWT的同类控件相比,它们在若干细节上有所调整。首先说单行输入框,AWT的单行输入框名叫TextField,平时输入什么字符它便显示什么字符,可一旦调用了setEchoChar方法设置回显字符,TextField马上变成只显示密文字符了。然而尴尬之处在于,设置回显字符之后,就没有办法取消原来的回显设置,输入框对象从此只能傻乎乎地显示密文了。如此一来,程序代码难以判断某个输入框究竟会显示明文还是密文,也无法确定输入框文字的加密与否。这不可避免会造成混淆,假设有几个控件都属于TextField类型,程序员怎知哪个是文本框,哪个又是密码框?难道要在浩如烟海的代码中寻找那个该死的setEchoChar方法吗?
鉴于文本框与密码框拥有不同的面貌,并不适合使用同一种类型来表达,故而Swing顺理成章将它俩拆分为两类控件:文本框JTextField与密码框JPasswordField。前者原样展示用户输入的字符,因而取消了回显字符设置方法setEchoChar;后者默认将输入字符显示为一个个圆点,当然程序员也可以调用setEchoChar方法重新设置回显字符。经过这么拆分处理,在Swing中不管输入普通文本还是输入密码,就不必担心弄错的情况了。除此之外,JTextField与JPasswordField的其余方法基本一样,用起来跟AWT的TextField控件差不多。比如下面的代码例子演示了JTextField的调用过程:

		JTextField textField = new JTextField(); // 创建一个单行输入框
textField.setEditable(true); // 设置输入框允许编辑
textField.setColumns(11); // 设置输入框的长度为11个字符
panel.add(textField); // 在面板上添加单行输入框

运行上述的文本框代码,弹出如下图所示的窗口界面,可见一条纯粹的文本输入框。


又如以下代码演示了密码框JPasswordField的调用过程:

		JPasswordField passwordField = new JPasswordField(); // 创建一个密码框
passwordField.setEditable(true); // 设置密码框允许编辑
passwordField.setColumns(6); // 设置密码框的长度为11个字符
//passwordField.setEchoChar('*'); // 设置密码框的回显字符。默认的回显字符为圆点
panel.add(passwordField); // 在面板上添加密码框

运行以上的密码框代码,弹出如下图所示的窗口界面,可见密码框的默认回显字符是个又圆又大的黑点。


接着说多行输入框,AWT的多行输入框名叫TextArea,该控件有个毛病:用户往里面输入文本,超过一行宽度后不会自动换行,必须用户按下回车键来手动换行。这种设计的使用体验无疑很糟糕,不能自动换行的话,用户敲多了回车键,肯定要怨声载道了。好在Swing的JTextArea控件及时弥补了这个问题,除了囊括TextArea的现有方法,JTextArea还增加了setLineWrap方法用来设置每行是否允许,调用该方法将其值设置为true时,往后输入的文本一旦超过每行宽度就会自动换到下一行。于是添加了setLineWrap方法的多行输入框调用代码示例如下:

		JTextArea area = new JTextArea(); // 创建一个多行输入框
area.setEditable(true); // 设置输入框允许编辑
area.setColumns(14); // 设置输入框的长度为14个字符
area.setRows(3); // 设置输入框的高度为3行字符
area.setLineWrap(true); // 设置每行是否允许折叠。为true的话,输入字符超过每行宽度就会自动换行
panel.add(area); // 在面板上添加多行输入框

运行上面的多行输入框代码,弹出如下图所示的窗口界面,可见输入框的内部文本的确支持自动换行了。


可是跟AWT的TextArea比起来,Swing的JTextArea默认不显示滚动条,即使文本的总高度已经超过了输入框的高度,期望中的滚动条仍未出现。这是因为Swing把滚动条也单独拎了出来,还给它取了个大名叫做JScrollPane,凡是需要上下滚动或者左右滚动的控件,都要搭配上JScrollPane才行。滚动条的用法也挺简单,只要在构造方法中填入待关联的控件对象,或者调用滚动条对象的setViewportView方法,都能将滚动条与指定控件绑定在一起。然后在面板上添加滚动条对象,如此便完成了输入框与滚动条的绑定操作,具体的绑定代码如下所示:

		JTextArea area = new JTextArea(); // 创建一个多行输入框
area.setEditable(true); // 设置输入框允许编辑
area.setColumns(14); // 设置输入框的长度为14个字符
area.setRows(3); // 设置输入框的高度为3行字符
area.setLineWrap(true); // 设置每行是否折叠。为true的话,输入字符超过每行宽度就会自动换行
// 因为下面添加滚动条的时候,滚动条已经关联了JTextArea,所以这里不必单独添加多行输入框
//panel.add(area); // 在面板上添加多行输入框
JScrollPane scroll = new JScrollPane(area); // 创建一个滚动条
//scroll.setViewportView(area); // 设置滚动条关联的控件
panel.add(scroll); // 在面板上添加滚动条

运行上面的滚动条绑定代码,弹出如下图所示的窗口界面,此时在输入框中填入好几行文本,在文本总高超过控件高度之后,输入框右侧的滚动条便如约出现了。


更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百二十九)Swing的输入框的更多相关文章

  1. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  2. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  3. Java开发笔记(八十九)缓存字节I/O流

    文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...

  4. Java开发笔记(二十四)方法的组成形式

    经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...

  5. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  6. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  7. Java开发笔记(二十八)布尔包装类型

    前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...

  8. Java开发笔记(四十九)关键字super的用法

    前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...

  9. Java开发笔记(五十九)Java8之后的扩展接口

    前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...

  10. Java开发笔记(六十九)泛型类的定义及其运用

    前面从泛型方法的用法介绍到了泛型的起源,既然单个方法允许拥有泛化的参数类型,那么一个类也应当支持类级别的泛化类型,例如各种容器类型ArrayList.HashMap等等.一旦某个类的定义代码在类名称后 ...

随机推荐

  1. Python 3.6 抓取微博m站数据

    Python 3.6 抓取微博m站数据 2019.05.01 更新内容 containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取: 优 ...

  2. SVN 常用 下载仓库

    仓库的基本使用: 1.管理仓库的人会给你一个SVN的仓库地址,如: https://192.168.2.98:8443/svn/建筑工程健康监测系统 2.然后就下载仓库里面的所有文件 3.对仓库做增删 ...

  3. [内网渗透]Cobaltstrike指令大全

    0x01 安装 Cobaltstrike是需要java环境才能运行的 linux下终端运行: sudo apt-get install openjdk-8-jdk windows下: 百度一堆配置JA ...

  4. Java中在时间戳计算的过程中遇到的数据溢出问题

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  5. 安装关系型数据库MySQL 安装大数据处理框架Hadoop

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 1.Hadoop的介绍 Hadoop最早起源于Nutch.Nut ...

  6. 【大数据作业十】分布式文件系统HDFS 练习

    作业要求来自: https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 利用Shell命令与HDFS进行交互 以”./bin/dfs ...

  7. 升级pip后,出现ImportError:cannot import name main

    升级pip后,出现ImportError错误,如下图: 解决方法: sudo gedit /usr/bin/pip 进去后修改为 from pip import __main__ if __name_ ...

  8. 【定制开发】经纪人报备软件 全民经纪人系统 房产中介微信小程序分享家恒房通

    信真科技2019年最先扛鼎之作 - 全民经纪人软件系统 1.含有最基础的经纪人注册.客户报备系统功能: 2.可支持定制开发,针对房企售楼部.中介门店: 3.与微信端绑定使用,方便快捷,快速分享: 4. ...

  9. CEF拦截js层alert弹窗 OnJSDialog 《转》

    一 引言 CEF3嵌入后,用JS 弹出Alert框,按钮错位,确定按钮勉强能看到.很难看.为了改善体验,决定重写提示框. 环境:VS2008  VC  MFC.   二 原理 参看类 CefJSDia ...

  10. 生成Nginx服务器SSL证书和客户端证书

    Nginx服务器SSL证书 生成pass key 下面的命令用于生成一个2048bit的pass key, -passout pass:111111 用于避免交互式输入密码 [tomcat@a02 t ...