JavaSwing之–JTextField
JTextField 是一个允许编辑单行文本的轻量级组件,它提供了一系列的构造方法和常用方法用来编写可以存储文本的文本框满足程序功能的需求。
以下在简要介绍常用构造方法、普通方法后详解各种方法的应用及举例。
一、构造方法
方法名称 | 功能描述 |
---|---|
JTextField() | 构造一个新的 TextField . |
JTextField(int columns) | 构造一个具有指定列数的新空 TextField 。 |
JTextField(String text) | 构造一个用指定文本初始化的新 TextField 。 |
JTextField(String text, int columns) | 构造一个用指定文本和列初始化的新 TextField 。 |
JTextField(Document doc, String text, int columns) | 构造一个新的 JTextField ,它使用给定的文本存储模型和给定的列数。 |
二、常用方法
方法名称 | 功能描述 |
---|---|
void setSize(int width,int height) | 设置文本框的尺寸 |
void setSize(Dimension d) | 设置文本框的尺寸 |
void setBounds(int x,int y,int width,int height) | 设置组件的起始位置及宽、高 |
void setLocation(int x,int y) | 设置文本框在容器的位置,其左上角坐标是(x,y) |
void setText(String str) | 设置文本框的内容 |
String getText() | 获取文本框内容,返回字符串 |
void setBorder(Border border) | 设置文本框的边框样式 |
void setTooltip(String str) | 设置文本框内容提示语 |
void setFont(Font font) | 设置文本框内容字体 |
void setForeground(Color color) | 设置文本框前景色(字体颜色) |
void setBackground(Color color) | 设置文本框背景色 |
void setEditable(Boolean boolean); | 设置文本框内容是否可编辑 |
void setHorizontalAlignment(int alignment) | 设置文本框内容对齐方式,默认左对齐 |
void setVisible(Boolean boolean) | 设置文本框是否可见 |
三、用法详解
3.1 构造方法详解
文本框的常用构造方法中常用到的参数有:
int columns:指定文本框的初始列数
String text:指定文本框初始包含的文本内容
如下代码所示。
// 创建一个空的文本框,无初始文本和默认宽度
JTextField textField1 = new JTextField();
// 创建一个宽度为30个字符的空文本框
JTextField textField2 = new JTextField(30);
// 创建一个带有初始文本内容的文本框
JTextField textField3 = new JTextField("初始文本内容");
// 创建一个宽度为30个字符并带有初始文本内容的文本框
JTextField textField4 = new JTextField("初始文本内容", 30);
在设置文本框初始内容时,可以根据程序需求根据应输入的内容设置为提示词,如:创建一个显示/输入用户名的文本框,将“请输入用户名”设为初始内容,当做提示词应用,详细应用见本文后续部分。
JTextField txtName = new JTextField("请输入用户名");
3.2 常用方法详解
- 获取文本
调用String getText()方法,获取文本框中输入的文本内容。
String str = textField1.getText().trim();//使用trim方法去除文本内容前后的空格
- 设置边框
setBorder(Border border)方法可以为边框设置不同样式的边框。参数border是一个Border类实例化对象。
Border是一个接口,需要重写类中的三个方法实现自定义边框。
自定义圆角边框示例
textField.setBorder(new Border(){
@Override
/**
* 重写painBorder(Component c, Graphics g, int x, int y, int width, int height)方法绘制带有圆角的边框
* @param c 组件,表示边框绘制在哪个组件上
* @param g Graphics对象,用于实际的绘制操作
* @param x 边框绘制区域的x坐标
* @param y 边框绘制区域的y坐标
* @param width 边框绘制区域的宽度
* @param height 边框绘制区域的高度
*/
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
// 创建Graphics2D对象,用于更高级的图形绘制,并确保资源在使用后被释放
Graphics2D g2d = (Graphics2D) g.create();
// 设置抗锯齿,提高图形绘制的质量,使边缘更平滑
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// 创建一个圆角矩形对象,定义边框的形状
// 这里使用width-1和height-1是为了避免绘制区域的右侧和下侧边缘出现额外的像素
// 20和20分别是圆角的宽度和高度,决定了圆角的弧度
Shape shape = new RoundRectangle2D.Double(x,y,width-1,height-1,20,20);
// 绘制边框
g2d.draw(shape);
// 释放Graphics2D对象,避免资源泄露
g2d.dispose();
}
/**
* 重写getBorderInsets方法以自定义边框的内边距
* 此方法用于指定组件边框的上、左、下、右边距
* @param c 组件对象,用于确定边框内边距的上下, 该参数在此方法中未使用,但保持了接口的一致性
* @return 返回一个Insets对象,定义了边框的上、左、下、右边距
*/
@Override
public Insets getBorderInsets(Component c) {
// 设置边框的内边距:上边距为1,左边距为10,下边距为1,右边距为1
return new Insets(1,10,1,1);
}
@Override
//设置文本是否不透明,true表示不透明,fase表示透明
public boolean isBorderOpaque() {
return true;
}
});
JDK中提供了可以提供Border对象的工厂类BorderFactory用于创建不同的边框对象,常见边框样式如下:
①createLineBorder(Color color,int thickets):创建具有指定颜色的线条边框。
// 设置文本字段的边框为线性,宽度为3,颜色为十六进制值0x00A182的颜色
textField.setBorder(BorderFactory.createLineBorder(new Color(0x00A182),3));
②createBevelBorder(int type, Color highlightOuter, Color highlightInner, Color shadowOuter, Color shadowInner):使用内部和外部高光和阴影区域的指定颜色创建指定类型的斜角边框。
textField.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.MAGENTA,Color.blue,Color.red,Color.green));
以上方法中type的数值为常数:BevelBorder.RAISED和BevelBorder.LOWERED。该方法有多重重载方式,可以使用最简单的方式创建边框,如下所示。
// 设置textField的边框为凸起的斜面边框,提高用户界面的视觉效果
textField.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
③createDashedBorder(Paint paint, float thickness, float length, float spacing, boolean rounded):创建指定 paint 、 thickness 、线形、相对 length 和相对 spacing的虚线边框。
// 设置textField3的边框为红色的虚线边框,指定线宽、线长、间隔和是否圆角
textField3.setBorder(BorderFactory.createDashedBorder(Color.red,2,2,2,true));
以上是最复杂方法的应用,该方法根据参数实际设置情况有多重重载方式,最简单方式是参数为null,如下所示。
// 设置textField3的边框为默认颜色的虚线边框
textField3.setBorder(BorderFactory.createDashedBorder(null));
④createEmptyBorder(int top, int left, int bottom, int right):创建一个占用空间但不绘制的空边框,指定边框的顶部、左侧、底部和右侧的宽度。
// 设置textField4的边框为空边框,上下左右边距均为5像素
textField4.setBorder(BorderFactory.createEmptyBorder(5,5,5,5))
⑤createEtchedBorder(EtchedBorder.RAISED,Color.red,Color.black)):使用指定的突出显示和阴影颜色创建具有“蚀刻”外观的边框。
// 设置textField5的边框为蚀刻(浮雕)效果的红色和黑色边框
textField5.setBorder(BorderFactory.createEtchedBorder(
EtchedBorder.RAISED,Color.red,Color.black));
该方法有多个重载方法,可根据需要调整参数个数创建不同具有蚀刻外观的边框。
⑥createTitledBorder(String title):创建具有指定标题、默认边框类型(由当前外观确定)、默认文本位置(由当前外观确定)、默认对齐方式(行距)和默认字体的新标题边框文本颜色(由当前外观决定)。
textField6.setBorder(BorderFactory.createTitledBorder("这是标题"));
若想指定边框类型、标题、文本位置、对齐方式、标题颜色,可以使用以下方法完成。
createTitledBorder(Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor)
textField6.setBorder(BorderFactory.createTitledBorder(
// 创建一个pink色、宽度为2的线条边框,设置标题为"这是标题"
BorderFactory.createLineBorder(Color.pink,2), "这是标题",
// 设置标题的位置为边框的右 trailing 边
TitledBorder.TRAILING,
// 设置标题相对于边框的位置为顶部
TitledBorder.TOP,
// 创建并设置标题的字体为微软雅黑、粗体、大小为12
new Font("微软雅黑",Font.BOLD,12),
// 设置标题的颜色为十六进制颜色值0x00A182
new Color(0x00A182)));
该方法有多个重载方法,可以调整参数个数及顺序创建不同风格的边框。
⑦createCompoundBorder(Border outsideBorder, Border insideBorder):创建一个复合边框,指定要用于外边和内边的边框对象。
// 设置textField的边框为复合边框,复合边框由内外两个边框组成
// 外层边框为粉红色线条边框,内层边框为透明边框,上下内边距为5像素,左内边距为10像素,右内边距为5像素
textField.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.pink),
BorderFactory.createEmptyBorder(5,10,5,5)));
更多边框设置介绍详见作者边框设置文章介绍
- 字体设置
调用setFont(Font font)方法 设置文本框内容字体。文本的字体、字号、样式封装为一个Font对象参数。示例如下:
// 设置textField1的字体为微软雅黑,,字号为20
textField1.setFont(new Font("微软雅黑", Font.PLAIN, 20));//样式为普通
textField1.setFont(new Font("微软雅黑", Font.BOLD|Font.ITALIC, 20));//样式为粗体、斜体
- 文本对齐方式
调用方法setHorizontalAlignment(int alignment) 设置文本框内容对齐方式,默认左对齐。参数alignmen是JTextField的常数,表示文本内容相对文本框的对齐方式,其值如下:
①JTextField.LEFT:左对齐
②JTextField.CENTER:居中对齐
③JTextField.RIGHT:右对齐
④JTextField.LEADING:头部对齐
⑤JTextField.TRAILING:尾部对齐
可以表示左对齐、居中对齐、右对齐、头部对齐、尾部对齐,代码示例如下:
textField1.setHorizontalAlignment(JTextField.LEFT); // 将文本对齐到左侧
textField1.setHorizontalAlignment(JTextField.CENTER); // 将文本居中对齐
textField1.setHorizontalAlignment(JTextField.RIGHT); // 将文本对齐到右侧
textField1.setHorizontalAlignment(JTextField.LEADING); // 根据文本字段的方向将文本对齐到前部边缘
textField1.setHorizontalAlignment(JTextField.TRAILING); // 根据文本字段的方向将文本对齐到尾尾部缘
- 设置文本颜色
调用setForeground(Color c)设置文本的颜色,参数c是一个Color对象。
//设置文本颜色
textField1.setForeground(Color.ORANGE); // 设置文本颜色为橙色
textField1.setForeground(new Color(0x00A182)); // 设置文本颜色为十六进制值0x00A182的颜色
textField1.setForeground(new Color(0, 0, 255)); // 设置文本颜色为RGB颜色(0, 0, 255)
- 设备背景色
调用setBackground(Color c)设置文本框背景色,参数c是一个Color对象。
textField1.setBackground(Color.ORANGE);// 设置文本颜色为橙色
textField1.setBackground(new Color(0x00A182));// 设置文本颜色为十六进制值0x00A182的颜色
textField1.setBackground(new Color(0, 0, 255));// 设置文本颜色为RGB颜色(0, 0, 255)
四、事件处理
文本框支持多种事件处理机制,常见的事件类型及处理监听接口如下表所示。
事件类型 | 描述 | 监听接口 |
---|---|---|
FocusEvent | 文本框获得/失去焦点时触发 | FocusListener |
MouseEvent | 文本框获得焦点时鼠标操作时触发 | MouseListener |
ActionEvent | 用户在文本框中输入内容后按下回车键触发 | ActionListener |
KeyEvent | 文本框获得焦点时键盘按键按下、释放、敲击时触发 | KeyListener |
DocumentEvent | 文本内容发生变化时(如增删字符、修改内容等)触发 | DocumentListener |
4.1 焦点事件
在 Java Swing 中,JTextField 支持通过 焦点事件(FocusEvent) 来监听文本框是否获得或失去了输入焦点。这通过 调用addFocusListener(FocusListener f)方法实现,参数为接口实现类对象或者FocusAdapter类实例,前者作为参数必须实现接口的焦点获得、失去方法,后者做参数可以根据需要仅实现其中之一即可。
焦点事件可以用于文本框提示词的操作中,以下代码演示了当文本获取焦点后提示词隐藏,失去焦点后提示词显示。
//增加焦点事件监听器
textField1.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
textField1.setText("");//清空输入框内容
}
@Override
public void focusLost(FocusEvent e) {
textField1.setText("请输入用户名");//恢复默认提示
}
});
更详细的操作与完善,请读者结合实际需求补充。
4.2 鼠标事件
鼠标事件通过在文本框上注册监听来完成,通常可以使用 addMouseListener 或 addMouseMotionListener 方法为组件添加监听器。
常用鼠标事件方法
-
mouseClicked(MouseEvent e):鼠标点击时触发。
-
mousePressed(MouseEvent e):鼠标按下时触发。
-
mouseReleased(MouseEvent e):鼠标释放时触发。
-
mouseEntered(MouseEvent e):鼠标进入组件区域时触发。
-
mouseExited(MouseEvent e):鼠标离开组件区域时触发。
addMouseListener(MouseListener m)方法以接口对象为参数必须全部重写以上所有方法,当使用MouseAdapter适配器对象作为参数时,可以根据需求重写以上鼠标事件方法中的任一一个或多个。
以下以鼠标移入文本框修改背景色、移出恢复背景色为例演示用法。
Color color = textField2.getBackground();//获取背景色
textField2.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
textField2.setBackground(new Color(0x14DEB7));//修改背景色
}
@Override
public void mouseExited(MouseEvent e) {
textField2.setBackground(color);//恢复背景色
}
});
4.3 动作事件
动作事件通过调用方法addActionListener(ActionListener a)实现附加到文本框上的事件处理。以回车获取文本框输入内容为例:
textField.addActionListener(e -> {
JOptionPane.showMessageDialog(frame,textField3.getText());//回车后显示输入框内容
});
4.4 键盘事件
键盘事件通过调用addKeyListener(KeyLIstener k)注册监听完成事件处理,该方法参数为KeyListener接口实例或适配器KeyAdapter抽象类对象,前者需要重写接口的keyTyped (KeyEvent e) 、keyPressed(KeyEvent e) 、keyReleased(KeyEvent e)三个方法,后者做参数只需要重写其中一个即可,据实际而定。
以在文本框中输入内容后回车获取输入内容为例:
public void keyPressed(KeyEvent e) {
// 检查按键事件是否为按下Enter键
if(e.getKeyCode()==KeyEvent.VK_ENTER){
//显示输入框内容
JOptionPane.showMessageDialog(frame,textField4.getText());
}
}
若想获取按下的是哪个字母键,可以根据需要在任一重写方法中调用键盘事件的getKeyChar()方法判断,举例如下:
public void keyPressed(KeyEvent e) {
JOptionPane.showMessageDialog(frame,e.getKeyChar());//显示按下的字母
}
4.5 文档事件
文本框的文档事件处理能有效解决文本插入、删除、修改相关的技术问题,在重写方法insertUpdate、removeUpdate、changedUpdate中根据需要完成既定的功能。
// 获取文本框的文档对象
Document document = textField5.getDocument();
// 为文档对象添加文档监听器
document.addDocumentListener(new DocumentListener() {
// 当文档中插入文本时调用
@Override
public void insertUpdate(DocumentEvent e) {
// 弹出对话框提示用户文本已插入
JOptionPane.showMessageDialog(frame,"插入文本");
}
// 当文档中删除文本时调用
@Override
public void removeUpdate(DocumentEvent e) {
// 弹出对话框提示用户文本已被删除
JOptionPane.showMessageDialog(frame,"删除文本");
}
// 当文档中的文本发生变化时调用
@Override
public void changedUpdate(DocumentEvent e) {
// 弹出对话框提示用户文本已改变
JOptionPane.showMessageDialog(frame,"文本改变");
}
});
五、总结
文本框是Java Swing编程中常见的应用组件,常用于文本内容的输入存储、显示、修改等操作,应用广泛。
在文本框上注册相关监听器,可以完成动作事件、键盘事件、鼠标事件、焦点事件、文档事件的处理,完善程序功能,提高程序运行效率。
更多功能详解参看相关的JDK说明文档。