第14章探讨了Swing组件集合的JSpinner所提供的动态输入选择控件。在本章中,我们将会了解Swing基本文本组件的基本功能。更为高级的文本组件将会下一章中进行探讨。
Swing组件集合包含五个文本组件。他们共享一个共同的父类,JTextComponent,其中定义了所有的文本组件的更同行为。
JTextComponent的直接子类是JTextField,JTextArea以及JEditorPane。JTextField用于单行的单属性文本(也就是单一的字体与单一的颜色)。JTextField有一个子类,JPasswordField,用于JTextField用作密码输入的情况。JTextArea用于单一属性文本的多行输入。JEditorPane是可以支持多属性输入编辑的通用编辑器。其子类JTextPane是输入普通文本格式而定制的。在这两个类中,除了文本,输入还可以图片与组件。
15.1 Swing文本组件概述
类似于所有其他的Swing组件,文本组件生活在MVC的世界中。显示在图15-1中的组件,类的层次结构图,是各种可用的UI委托。UI委托模型的其余部分是文本视图,他基于View类,我们会在第16章进行进一步的讨论。
注意,所有的JTextComponent子类位于javax.swing包中。除了事件相关的部分,本章中所讨论的支持接口与类都位于javax.swing.text包(或是子包)中。Swing特定的,文本相关的事件部分位于javax.swing.event包中,其余的位于java.awt.event与java.beans中。
每一个组件的模型都是Document接口的实现,他有五个扩展(或是实现)。单属性组件使用PlainDocument类作为其数据模型,而多属性组件使用DefaultStyledDocument作为其模型。所有这些类派生自AbstractDocument类,在其中定义了他们共同的Document接口实现。DefaultStyleDocument类也实现了StyledDocument接口,他是Document用于支持多属性内容的扩展。另一个Document实现,HTMLDocument,用于JEditorPane的内容类型为text/html的情况。为了限制到这些文档的输入,我们可以使用DocumentFilter类。
本章中以及第16章中将要讨论的许多其他具有共同的文本组件特性。类似于许多其他的Swing组件,我们可以自定义组件的观感而无需创建新的UI委托。对于文本组件,Highlighter,Caret以及NavigationFilter接口分别描述了文本如何高亮显示,在哪里插入文本以及如何限制鼠标位置,从而使得我们可以自定义文本组件的外观以及输入行为。另外,InputMap/ActionMap类定义了击键与文本动作之间的绑定,从而允许我们非常容易的修改文本组件的行为。
其他的组件模型部分被设计用于事件处理。我们并没有被限制使用KeyListener/KeyEvent或是TextEvent/TextListener绑定来处理输入验证。Swing组件同时使用DocumentEvent/DocumentListener组合(以及第2章所描述的InputVerifier)。这种组合提供了一种更为灵活的输入验证方式,特别是在Swing文本组件的MVC环境中。额外的事件处理是通过在第2章所介绍的AbstractAction功能扩展来实现的。这就是用于将键盘绑定与Action实现相关联的TextAction类,我们将会在第16章中进行详细的讨论。文本框架中的许多部分是通过所谓的EditorKit连接在一起的,我们也会在第16章中进行讨论。
注意,由于Swing文本组件类之间的相互连接,我们将会在本章中与第16章中的大量引用关联。我们可以自由的在两章之间进行跳转并且接下来阅读某一功能的详细讨论。
15.2 JTextComponent类
JTextComponent类是用作所有文本视图的组件的父类。他描述了所有文本组件所共享的共同行为。在这些共同行为中包括用于选中支持的Highlight,用于在内容中浏览的Caret,通过action属性(Action实现数组)支持的命令集合,通过KeyMap或是InputMap/ActionMap组合支持的键盘绑定集合,一个Scrollable接口实现,从而每一个特定的文本组件都可以放在JScrollPane中,以及存储在组件中的文本。如果所有的这些听起来需要大量的管理,不要担心。本章将会为我们给出指导。
15.2.1 JTextComponent属性
表15-1显示了JTextComponent的27个属性。这些属性覆盖我们所期望的文本组件功能。
这些属性被分为八个基本类别:
- 数据模型:document属性用于所有文本组件的数据模型。text属性用于将这个数据模型看作一个String。
- 颜色:caretColor,disabledTextColor, selectedTextColor与selectionColor属性,以及继承的foreground与background属性指定了渲染光标,禁止文本,所选文本,所选文本的背景,常规文本以及常规文本的背景等颜色。
- Caret:caret,caretPosition与navigationFilter属性用于在文档中浏览。
- Highlighter:highlighter,selectionStart与selectionEnd属性负责高亮显示文档中的selectedText部分。
- Margin:margin属性用于指定文本内容距离文本组件的边界多远显示。
- 事件:actions与keymap属性描述了文本组件支持哪些功能。对于actions属性的Action[]情况,功能是我们为了事件处理可以关联到组件的一系列ActionListener实现。例如,不必创建一个ActionListener来执行剪切、复制与粘贴操作,我们会发现actions属性中的相应的Action并将其关联到组件。keymap的作用类似,但是他是将Action关联到特定的键。例如,他包含一个按键映射条目用于处理当PageUp键被按下时如何响应。caretListsener属性允许我们发现观察文本组件的CaretListener对象集合。dragEnabled设置描述了组件是否支持在组件中拖放文本。(要了解Swing中的拖放支持信息,可以查看第19章。)
- 滚动接口:属性preferredScrollableViewportSize, scrollableTracksViewportHeight,与scrollableTracksViewportWidth是相应的Scrollable接口方法的实现。
- 状态:editable与focusTraversable属性描述了文本组件的各种状态。editable允许我们文本组件设置为只读。对于只读的focusTraversable属性,当他们被使能时文本组件位于信息循环中(也就是我们可以使用Tab键遍历)。focusAccelerator用于相邻的JLabel在其labelFor属性设置文本组件的情况,允许我们使用JLabel的可视化热键将焦点移动到文本组件。componentOrientation设置描述了组件的文本如何绘制。将这一特性于类似Hebrew那样由右到左的语言并不是必须,但却是绘制字符的最好方法。JTextComponent由JComponent继承了opaque属性。当opaque属性被设置为false时,文本组件后面的区域内容会被看穿,如果需要,可以允许我们具有一个图片背景。图15-2显示了这一效果。
列表15-1是用于生成图15-2的源码。如果我们取消setOpaque(false)一行,则背景不会显现。
package swingstudy.ch13;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.GrayFilter;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class BackgroundSample {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Background Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final ImageIcon imageIcon = new ImageIcon("draft.gif");
JTextArea textArea = new JTextArea() {
Image image = imageIcon.getImage();
Image grayImage = GrayFilter.createDisabledImage(image);
{
setOpaque(false); // instance initializer
}
public void paint(Graphics g) {
g.drawImage(grayImage, 0, 0, this);
super.paint(g);
}
};
JScrollPane scrollPane = new JScrollPane(textArea);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(255, 2550);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
15.2.2 JTextComponent操作
JTextComponent为文本控件上所执行的许多操作定义了基本的框架。
- I/O:public void read(Reader in, Object description)与public void write(Writer out)方法(都抛出IOException)允许我们简单的读取或是写入文本组件内容。
- 剪切板访问:public void cut(), public void copy()与public void paste()方法提供了到系统剪切板的直接访问。
- 位置:public void moveCaretPosition(int position)方法允许我们定位caret。位置表示标明由文本组件开始处到caret之前的字符数的一维定位。
- 选中:public void replaceSelection(String content), public void selectAll()与public void select(int selectionStart, int selectionEnd)方法允许我们组件中的内容部分与替换所选择的内容。
- Conversion:public Rectange modelToView(int position) throws BadLocationException与public int viewToModel(Point point)方法允许我们(或者更可能的是系统)将JTextComponent内的一个位置映射到特定文本UI委托的内容表示中的映射。
现在我们已经概述了JTextComponent类,现在是了解其不同的子类的时候了。首先是JTextField,他将会被用来演示刚才所列出的操作。
分享到:
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip