Java 文本框
什么是Java文本框?
文本框是Java GUI编程中最常用的组件之一,它允许用户在应用程序中输入和编辑文本。在Java中,文本框主要由Swing库中的JTextField
和JTextArea
类实现,用于接收单行和多行文本输入。文本框广泛应用于表单、搜索功能、对话框等场景。
Java 文本框的类型
在Java Swing中,文本框组件主要有以下几种:
- JTextField - 单行文本输入框
- JPasswordField - 密码输入框,能够隐藏用户输入
- JTextArea - 多行文本输入区域
- JEditorPane - 支持样式化文本编辑
- JTextPane - 高级样式化文本编辑组件
本教程将主要介绍最常用的JTextField
和JTextArea
。
JTextField - 单行文本框
JTextField
是Java Swing中用于接收单行文本输入的组件。它常用于表单中收集用户信息,如姓名、电子邮件地址等。
创建JTextField
创建一个JTextField
非常简单:
// 创建一个空的文本框
JTextField textField = new JTextField();
// 创建一个具有初始文本的文本框
JTextField textField = new JTextField("初始文本");
// 创建一个指定宽度的文本框(以字符数计算)
JTextField textField = new JTextField(20);
// 创建一个具有初始文本和指定宽度的文本框
JTextField textField = new JTextField("初始文本", 20);
JTextField的常用方法
以下是一些常用的JTextField
方法:
// 设置文本
textField.setText("新文本");
// 获取文本
String text = textField.getText();
// 选择文本
textField.selectAll();
textField.select(0, 5); // 选择从索引0到5的文本
// 设置文本对齐方式
textField.setHorizontalAlignment(JTextField.CENTER); // 居中对齐
textField.setHorizontalAlignment(JTextField.LEFT); // 左对齐
textField.setHorizontalAlignment(JTextField.RIGHT); // 右对齐
// 设置可编辑性
textField.setEditable(false); // 设置为只读
// 设置文本颜色
textField.setForeground(Color.BLUE);
// 设置背景颜色
textField.setBackground(Color.LIGHT_GRAY);
// 设置字体
textField.setFont(new Font("Arial", Font.BOLD, 14));
处理JTextField事件
最常用的JTextField
事件是动作事件(当用户按下Enter键时触发)和文档监听器(当文本内容变化时触发)。
// 添加动作监听器(按Enter键时触发)
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("你输入的是: " + textField.getText());
}
});
// 监听文本变化
textField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
textChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
textChanged();
}
@Override
public void changedUpdate(DocumentEvent e) {
textChanged();
}
private void textChanged() {
System.out.println("文本已更改为: " + textField.getText());
}
});
JPasswordField - 密码文本框
JPasswordField
是JTextField
的一个子类,专门用于输入密码。它的特点是显示掩码字符(默认为 '•')而非实际输入的字符。
// 创建密码框
JPasswordField passwordField = new JPasswordField(20);
// 设置掩码字符
passwordField.setEchoChar('*');
// 获取密码(返回char数组,而不是String,出于安全考虑)
char[] password = passwordField.getPassword();
出于安全考虑,不要使用getText()
方法从JPasswordField
获取密码,而应使用getPassword()
方法。使用完密码后,应该清空密码数组。
JTextArea - 多行文本区域
JTextArea
是用于多行文本输入的组件,适合用于接收大段文本,如评论、描述等。
创建JTextArea
// 创建一个空的文本区域
JTextArea textArea = new JTextArea();
// 创建一个具有初始文本的文本区域
JTextArea textArea = new JTextArea("初始文本");
// 创建指定行数和列数的文本区域
JTextArea textArea = new JTextArea(5, 20); // 5行20列
// 创建具有初始文本和指定大小的文本区域
JTextArea textArea = new JTextArea("初始文本", 5, 20);
JTextArea的常用方法
// 设置文本
textArea.setText("新文本\n第二行");
// 追加文本
textArea.append("\n追加的文本");
// 获取文本
String text = textArea.getText();
// 设置自动换行
textArea.setLineWrap(true);
// 设置换行不拆分单词
textArea.setWrapStyleWord(true);
// 设置Tab键大小
textArea.setTabSize(4);
// 设置可编辑性
textArea.setEditable(false); // 设置为只读
添加滚动条
对于JTextArea
,我们通常会将其放入JScrollPane
,以便当文本内容超出可见区域时可以滚动查看。
JTextArea textArea = new JTextArea(10, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
frame.add(scrollPane); // 将滚动面板添加到窗口
实际案例:简单的记事本应用
下面是一个结合JTextField
、JTextArea
和其他组件创建的简单记事本应用示例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class SimpleNotepad extends JFrame {
private JTextArea textArea;
private JTextField searchField;
public SimpleNotepad() {
setTitle("简单记事本");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建菜单
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("文件");
JMenuItem openItem = new JMenuItem("打开");
JMenuItem saveItem = new JMenuItem("保存");
JMenuItem exitItem = new JMenuItem("退出");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.addSeparator();
fileMenu.add(exitItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
// 创建文本区域和滚动面板
textArea = new JTextArea();
textArea.setFont(new Font("宋体", Font.PLAIN, 14));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
// 创建搜索面板
JPanel searchPanel = new JPanel(new BorderLayout());
searchField = new JTextField(20);
JButton searchButton = new JButton("搜索");
searchPanel.add(new JLabel("查找: "), BorderLayout.WEST);
searchPanel.add(searchField, BorderLayout.CENTER);
searchPanel.add(searchButton, BorderLayout.EAST);
// 设置布局
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
add(searchPanel, BorderLayout.SOUTH);
// 添加事件监听器
openItem.addActionListener(e -> openFile());
saveItem.addActionListener(e -> saveFile());
exitItem.addActionListener(e -> System.exit(0));
searchButton.addActionListener(e -> searchText());
searchField.addActionListener(e -> searchText());
setVisible(true);
}
private void openFile() {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try (BufferedReader reader = new BufferedReader(new FileReader(selectedFile))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
textArea.setText(content.toString());
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "读取文件失败: " + e.getMessage(),
"错误", JOptionPane.ERROR_MESSAGE);
}
}
}
private void saveFile() {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showSaveDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try (BufferedWriter writer = new BufferedWriter(new FileWriter(selectedFile))) {
writer.write(textArea.getText());
JOptionPane.showMessageDialog(this, "文件保存成功!");
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "保存文件失败: " + e.getMessage(),
"错误", JOptionPane.ERROR_MESSAGE);
}
}
}
private void searchText() {
String searchTerm = searchField.getText();
String text = textArea.getText();
if (searchTerm.isEmpty()) {
return;
}
int index = text.indexOf(searchTerm);
if (index != -1) {
textArea.setCaretPosition(index);
textArea.select(index, index + searchTerm.length());
textArea.requestFocusInWindow();
} else {
JOptionPane.showMessageDialog(this, "找不到文本: " + searchTerm);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new SimpleNotepad());
}
}
这个应用程序展示了如何使用JTextField
和JTextArea
创建实用的功能:
JTextField
用于搜索文本JTextArea
用于显示和编辑文件内容- 应用包含打开、保存文件和搜索文本功能
文本框验证
在实际应用中,我们通常需要验证用户在文本框中输入的内容。以下是一个使用DocumentFilter
验证数字输入的示例:
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
public class TextFieldValidationExample extends JFrame {
public TextFieldValidationExample() {
setTitle("输入验证示例");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
// 仅数字的文本框
JLabel numLabel = new JLabel("仅数字:");
JTextField numField = new JTextField(10);
// 应用数字过滤器
((AbstractDocument)numField.getDocument()).setDocumentFilter(new NumberDocumentFilter());
add(numLabel);
add(numField);
setVisible(true);
}
// 数字过滤器类
class NumberDocumentFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
throws BadLocationException {
// 仅允许数字字符通过
if (string.matches("\\d*")) {
super.insertString(fb, offset, string, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
// 仅允许数字字符通过
if (text.matches("\\d*")) {
super.replace(fb, offset, length, text, attrs);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TextFieldValidationExample());
}
}
格式化文本框 - JFormattedTextField
对于需要特定格式的输入(如日期、数字等),Java提供了JFormattedTextField
类。
import javax.swing.*;
import java.awt.*;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormattedTextFieldExample extends JFrame {
public FormattedTextFieldExample() {
setTitle("格式化文本框示例");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(3, 2, 10, 10));
// 数字格式化文本框
JLabel numberLabel = new JLabel("数字格式:");
NumberFormat numberFormat = NumberFormat.getNumberInstance();
JFormattedTextField numberField = new JFormattedTextField(numberFormat);
numberField.setValue(10000);
// 货币格式化文本框
JLabel currencyLabel = new JLabel("货币格式:");
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
JFormattedTextField currencyField = new JFormattedTextField(currencyFormat);
currencyField.setValue(12345.67);
// 日期格式化文本框
JLabel dateLabel = new JLabel("日期格式:");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
JFormattedTextField dateField = new JFormattedTextField(dateFormat);
dateField.setValue(new Date());
add(numberLabel);
add(numberField);
add(currencyLabel);
add(currencyField);
add(dateLabel);
add(dateField);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new FormattedTextFieldExample());
}
}
总结
在Java GUI编程中,文本框是最基本也是最常用的输入组件之一。本教程介绍了:
- 单行文本框
JTextField
- 用于接收简单的单行文本输入 - 密码框
JPasswordField
- 用于安全地输入密码 - 多行文本区域
JTextArea
- 用于多行文本输入 - 格式化文本框
JFormattedTextField
- 用于特定格式的文本输入
我们还学习了如何设置文本框的属性、处理事件、验证输入以及在实际应用中使用这些组件。文本框组件在几乎所有的桌面应用程序中都扮演着重要角色,掌握这些基础知识将帮助你构建功能丰富的用户界面。
练习
- 创建一个计算器应用,使用
JTextField
显示结果,使用按钮输入数字和操作符。 - 开发一个登录表单,包含用户名字段(
JTextField
)和密码字段(JPasswordField
)。 - 创建一个地址簿应用,使用多个
JTextField
来输入和编辑联系人信息。 - 实现一个简单的聊天窗口,使用
JTextArea
显示对话,使用JTextField
输入消息。 - 创建一个表单验证示例,验证电子邮件地址是否有效。