跳到主要内容

Java 文本框

什么是Java文本框?

文本框是Java GUI编程中最常用的组件之一,它允许用户在应用程序中输入和编辑文本。在Java中,文本框主要由Swing库中的JTextFieldJTextArea类实现,用于接收单行和多行文本输入。文本框广泛应用于表单、搜索功能、对话框等场景。

Java 文本框的类型

在Java Swing中,文本框组件主要有以下几种:

  1. JTextField - 单行文本输入框
  2. JPasswordField - 密码输入框,能够隐藏用户输入
  3. JTextArea - 多行文本输入区域
  4. JEditorPane - 支持样式化文本编辑
  5. JTextPane - 高级样式化文本编辑组件

本教程将主要介绍最常用的JTextFieldJTextArea

JTextField - 单行文本框

JTextField是Java Swing中用于接收单行文本输入的组件。它常用于表单中收集用户信息,如姓名、电子邮件地址等。

创建JTextField

创建一个JTextField非常简单:

java
// 创建一个空的文本框
JTextField textField = new JTextField();

// 创建一个具有初始文本的文本框
JTextField textField = new JTextField("初始文本");

// 创建一个指定宽度的文本框(以字符数计算)
JTextField textField = new JTextField(20);

// 创建一个具有初始文本和指定宽度的文本框
JTextField textField = new JTextField("初始文本", 20);

JTextField的常用方法

以下是一些常用的JTextField方法:

java
// 设置文本
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键时触发)和文档监听器(当文本内容变化时触发)。

java
// 添加动作监听器(按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 - 密码文本框

JPasswordFieldJTextField的一个子类,专门用于输入密码。它的特点是显示掩码字符(默认为 '•')而非实际输入的字符。

java
// 创建密码框
JPasswordField passwordField = new JPasswordField(20);

// 设置掩码字符
passwordField.setEchoChar('*');

// 获取密码(返回char数组,而不是String,出于安全考虑)
char[] password = passwordField.getPassword();
警告

出于安全考虑,不要使用getText()方法从JPasswordField获取密码,而应使用getPassword()方法。使用完密码后,应该清空密码数组。

JTextArea - 多行文本区域

JTextArea是用于多行文本输入的组件,适合用于接收大段文本,如评论、描述等。

创建JTextArea

java
// 创建一个空的文本区域
JTextArea textArea = new JTextArea();

// 创建一个具有初始文本的文本区域
JTextArea textArea = new JTextArea("初始文本");

// 创建指定行数和列数的文本区域
JTextArea textArea = new JTextArea(5, 20); // 5行20列

// 创建具有初始文本和指定大小的文本区域
JTextArea textArea = new JTextArea("初始文本", 5, 20);

JTextArea的常用方法

java
// 设置文本
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,以便当文本内容超出可见区域时可以滚动查看。

java
JTextArea textArea = new JTextArea(10, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
frame.add(scrollPane); // 将滚动面板添加到窗口

实际案例:简单的记事本应用

下面是一个结合JTextFieldJTextArea和其他组件创建的简单记事本应用示例:

java
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());
}
}

这个应用程序展示了如何使用JTextFieldJTextArea创建实用的功能:

  • JTextField用于搜索文本
  • JTextArea用于显示和编辑文件内容
  • 应用包含打开、保存文件和搜索文本功能

文本框验证

在实际应用中,我们通常需要验证用户在文本框中输入的内容。以下是一个使用DocumentFilter验证数字输入的示例:

java
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类。

java
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编程中,文本框是最基本也是最常用的输入组件之一。本教程介绍了:

  1. 单行文本框 JTextField - 用于接收简单的单行文本输入
  2. 密码框 JPasswordField - 用于安全地输入密码
  3. 多行文本区域 JTextArea - 用于多行文本输入
  4. 格式化文本框 JFormattedTextField - 用于特定格式的文本输入

我们还学习了如何设置文本框的属性、处理事件、验证输入以及在实际应用中使用这些组件。文本框组件在几乎所有的桌面应用程序中都扮演着重要角色,掌握这些基础知识将帮助你构建功能丰富的用户界面。

练习

  1. 创建一个计算器应用,使用JTextField显示结果,使用按钮输入数字和操作符。
  2. 开发一个登录表单,包含用户名字段(JTextField)和密码字段(JPasswordField)。
  3. 创建一个地址簿应用,使用多个JTextField来输入和编辑联系人信息。
  4. 实现一个简单的聊天窗口,使用JTextArea显示对话,使用JTextField输入消息。
  5. 创建一个表单验证示例,验证电子邮件地址是否有效。

进一步阅读