文档

Java™ 教程
隐藏目录
如何使用文本字段
指南: 使用 Swing 创建 GUI
课程: 使用 Swing 组件
章节: 如何使用各种组件

如何使用文本字段

文本字段是一种基本的文本控件,它使用户能够输入少量文本。当用户表示输入完成(通常是按下回车键)时,文本字段会触发一个动作事件。如果您需要从用户获取多行输入,请使用文本区域

Swing API提供了几个类,这些类要么是文本字段的变体,要么包含文本字段。

JTextField 本节内容:基本文本字段。
JFormattedTextField 允许您指定用户可以输入的合法字符集的JTextField子类。请参阅如何使用格式化文本字段
JPasswordField 不显示用户输入的字符的JTextField子类。请参阅如何使用密码字段
JComboBox 可编辑,并提供一个供用户选择的字符串菜单。请参阅如何使用组合框
JSpinner 将格式化文本字段与一对小按钮结合起来,使用户可以选择上一个或下一个可用值。请参阅如何使用微调器

以下示例显示了一个基本文本字段和一个文本区域。文本字段可编辑,文本区域不可编辑。当用户在文本字段中按下回车键时,程序会将文本字段的内容复制到文本区域,并选择文本字段中的所有文本。

TextDemo的快照

点击“启动”按钮以使用Java™ Web Start运行TextDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引

启动TextDemo应用程序

您可以在TextDemo.java中找到此程序的完整代码。以下代码创建并设置文本字段:

textField = new JTextField(20);

在这个例子中,传递给JTextField构造函数的整数参数(在这个例子中是20)表示字段的列数。这个数字与字段当前字体提供的度量标准一起用来计算字段的首选宽度。它并不限制用户可以输入的字符数。要限制字符数,您可以使用格式化文本字段或文档监听器,如文本组件特性中所描述的。


注意: 

我们鼓励您为每个文本字段指定列数。如果您不指定列数或首选大小,那么每当文本更改时,字段的首选大小都会发生变化,这可能会导致不必要的布局更新。


下一行代码将TextDemo对象注册为文本字段的动作监听器。

textField.addActionListener(this);

actionPerformed方法处理文本字段的动作事件:

private final static String newline = "\n";
...
public void actionPerformed(ActionEvent evt) {
    String text = textField.getText();
    textArea.append(text + newline);
    textField.selectAll();
}

请注意,使用JTextFieldgetText方法检索文本字段当前包含的文本。此方法返回的文本不包括触发动作事件的Enter键的换行符。

您已经看到了如何使用基本文本字段。因为JTextField类继承自JTextComponent类,所以文本字段非常灵活,可以根据需要进行自定义。例如,您可以添加文档监听器或文档过滤器,以在文本更改时得到通知,在过滤器的情况下,您可以相应地修改文本字段。有关文本组件的信息可以在文本组件特性中找到。但在自定义JTextField之前,请确保其他基于文本字段的组件是否能够胜任您的工作。

通常,文本字段与描述文本字段的标签配对使用。有关创建这些配对的指导,请参见使用文本字段的示例

另一个示例:TextFieldDemo

TextFieldDemo示例介绍了一个文本字段和一个文本区域。您可以在TextFieldDemo.java中找到此程序的完整代码。

当您在文本字段中键入字符时,程序会在文本区域中搜索键入的文本。如果找到该条目,则会将其突出显示。如果程序无法找到该条目,则文本字段的背景变为粉色。文本区域下方的状态栏会显示文本是否被找到。按下Escape键可开始新的搜索或结束当前搜索。以下是TextFieldDemo应用程序的图片。

TextFieldDemo的快照

点击"Launch"按钮使用Java™ Web Start运行TextFieldDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参阅示例索引

启动TextFieldDemo应用程序

为了突出显示文本,此示例使用了一个highlighter和一个painter。下面的代码创建并设置了文本区域的highlighter和painter。

final Highlighter hilit;
final Highlighter.HighlightPainter painter;
...
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
textArea.setHighlighter(hilit);

此代码向文本字段的文档添加了一个文档监听器。

entry.getDocument().addDocumentListener(this);

文档监听器的insertUpdateremoveUpdate方法调用search方法,该方法不仅在文本区域中执行搜索,还处理突出显示。以下代码突出显示找到的文本,将插入符设置为找到匹配的末尾,将文本字段的默认背景设置为,status bar中显示消息。

hilit.addHighlight(index, end, painter);
textArea.setCaretPosition(end);
entry.setBackground(entryBg);
message("'" + s + "' found. Press ESC to end search");

状态栏是一个JLabel对象。下面的代码显示了message方法的实现。

private JLabel status;
...
void message(String msg) {
    status.setText(msg);
}

如果文本区域中没有找到匹配项,则以下代码将文本字段的背景更改为粉色,并显示适当的信息消息。

entry.setBackground(ERROR_COLOR);
message("'" + s + "' not found. Press ESC to start a new search");

CancelAction类负责处理Escape键的操作,如下所示。

   class CancelAction extends AbstractAction {
       public void actionPerformed(ActionEvent ev) {
               hilit.removeAllHighlights();
               entry.setText("");
               entry.setBackground(entryBg);
           }
   }

文本字段API

以下表格列出了常用的JTextField构造函数和方法。您可能还会调用继承自文本字段其他祖先的方法,如setPreferredSizesetForegroundsetBackgroundsetFont等。请参阅文本组件API

您还可以调用继承自文本字段的其他祖先的方法,例如setPreferredSizesetForegroundsetBackgroundsetFont等。请参阅JComponent类以获取常用继承方法的表格。

使用文本字段的API可分为以下几类:

设置或获取字段的内容
方法或构造函数 目的
JTextField()
JTextField(String)
JTextField(String, int)
JTextField(int)
创建一个文本字段。当存在int参数时,它指定了所需的列宽。String参数包含字段的初始文本。
void setText(String)
String getText()
(在JTextComponent中定义)
设置或获取文本字段显示的文本。
调整字段外观
方法 目的
void setEditable(boolean)
boolean isEditable()
(在JTextComponent中定义)
设置或指示用户是否可以编辑文本字段中的文本。
void setColumns(int);
int getColumns()
设置或获取文本字段显示的列数。这只是计算字段首选宽度的提示。
void setHorizontalAlignment(int);
int getHorizontalAlignment()
设置或获取文本在其区域内的水平对齐方式。您可以使用JTextField.LEADINGJTextField.CENTERJTextField.TRAILING作为参数。
实现字段功能
方法 目的
void addActionListener(ActionListener)
void removeActionListener(ActionListener)
添加或删除动作监听器。
void selectAll()
(在JTextComponent中定义)
选择文本字段中的所有字符。

使用文本字段的示例

这个表格展示了一些使用文本字段的示例,并指出了这些示例所描述的位置。如果想查看在所有类型的文本字段中相似的代码示例(如处理布局),请查看相关组件的示例列表,比如格式化文本字段微调器

示例 描述位置 备注
TextDemo 本节 一个使用基本文本字段和动作监听器的应用程序。
TextFieldDemo 本节 一个使用文本字段和文本区域的应用程序。在文本区域中进行搜索,以从文本字段中找到一个条目。
DialogDemo 创建对话框 CustomDialog.java包含一个检查值的文本字段。你可以通过点击More Dialogs选项卡,选择Input-validating dialog选项,然后点击Show it!按钮来弹出对话框。
TextSamplerDemo 使用文本组件 使用GridBagLayout和一个方便的方法来布局标签-文本字段对:
TextInputDemo 使用格式化文本字段 使用SpringLayoutSpringUtilities方便的方法来布局标签-文本字段对:

如果你正在使用JavaFX编程,请参考文本框


上一页: 如何使用文本区域
下一页: 如何使用工具栏