# 如何使用文本字段 > 原文: [https://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html](https://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html) 文本字段是一种基本文本控件,使用户可以键入少量文本。当用户指示文本输入完成时(通常按 Enter 键),文本字段将触发[动作事件](../events/actionlistener.html)。如果您需要从用户获得多行输入,请使用[文本区域](textarea.html)。 | [`JTextField`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html) | 本节内容包括:基本文本字段。 | | `JFormattedTextField` | 一个`JTextField`子类,允许您指定用户可以输入的合法字符集。请参见[如何使用格式化文本字段](formattedtextfield.html)。 | | `JPasswordField` | 一个`JTextField`子类,不显示用户键入的字符。参见[如何使用密码字段](passwordfield.html)。 | | `JComboBox` | 可以编辑,并提供可供选择的字符串菜单。参见[如何使用组合框](combobox.html)。 | | `JSpinner` | 将带格式的文本字段与几个小按钮组合在一起,使用户可以选择上一个或下一个可用值。参见[如何使用旋转器](spinner.html)。 | 以下示例显示基本文本字段和文本区域。文本字段是可编辑的。文本区域不可编辑。当用户在文本字段中按 Enter 键时,程序将文本字段的内容复制到文本区域,然后选择文本字段中的所有文本。 ![A snapshot of TextDemo](img/84de758975d07856819b79be8b3cec55.jpg) 单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) ([下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html))运行 TextDemo。或者,要自己编译并运行示例,请参考[示例索引](../examples/components/index.html#TextDemo)。 [![Launches the TextDemo application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TextDemoProject/TextDemo.jnlp) 您可以在 [`TextDemo.java`](../examples/components/TextDemoProject/src/components/TextDemo.java) 中找到该程序的完整代码。以下代码创建并设置文本字段: ``` textField = new JTextField(20); ``` 传递给`JTextField`构造函数的整数参数,示例中的`20`表示字段中的列数。此数字与字段当前字体提供的度量一起使用,以计算字段的首选宽度。它不限制用户可以输入的字符数。为此,您可以使用[格式的文本字段](formattedtextfield.html)或文档侦听器,如[文本组件功能](generaltext.html)中所述。 * * * **Note:**  我们建议您为每个文本字段指定列数。如果未指定列数或首选大小,则只要文本更改,字段的首选大小就会更改,这可能会导致不必要的布局更新。 * * * 下一行代码将`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(); } ``` 注意使用`JTextField`的`getText`方法来检索文本字段当前包含的文本。此方法返回的文本 _ 而不是 _ 包含触发操作事件的 Enter 键的换行符。 您已经了解了如何使用基本文本字段。因为`JTextField`类继承自`JTextComponent`类,所以文本字段非常灵活,几乎可以按照您喜欢的方式进行自定义。例如,您可以添加文档侦听器或文档过滤器以在文本更改时收到通知,并且在过滤器情况下,您可以相应地修改文本字段。有关文本组件的信息可在[文本组件功能](generaltext.html)中找到。但是,在自定义`JTextField`之前,请确保基于文本字段的其他[组件之一不会为您完成此任务。](#varieties) 通常,文本字段与描述文本字段的标签配对。有关创建这些对的指示,请参见[使用文本字段](#eg)的示例。 `TextFieldDemo`示例引入了文本字段和文本区域。您可以在 [`TextFieldDemo.java`](../examples/components/TextFieldDemoProject/src/components/TextFieldDemo.java) 中找到该程序的完整代码。 当您在文本字段中键入字符时,程序将在文本区域中搜索键入的文本。如果找到该条目,则会突出显示该条目。如果程序找不到该条目,则文本字段的背景变为粉红色。文本区域下方的状态栏显示是否找到文本的消息。 Escape 键用于开始新搜索或完成当​​前搜索。这是`TextFieldDemo`应用程序的图片。 ![A snapshot of TextFieldDemo](img/5b2f00d4c132c76f83791b621fd4949d.jpg) 单击启动按钮运行 TextFieldDemo,使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) ([下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html))。或者,要自己编译并运行示例,请参考[示例索引](../examples/components/index.html#TextFieldDemo)。 [![Launches the TextFieldDemo Application](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TextFieldDemoProject/TextFieldDemo.jnlp) 为突出显示文本,此示例使用荧光笔和画家。下面的代码创建并设置文本区域的荧光笔和画家。 ``` final Highlighter hilit; final Highlighter.HighlightPainter painter; ... hilit = new DefaultHighlighter(); painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR); textArea.setHighlighter(hilit); ``` 此代码将文档侦听器添加到文本字段的文档中。 ``` entry.getDocument().addDocumentListener(this); ``` 文档侦听器的`insertUpdate`和`removeUpdate`方法调用`search`方法,该方法不仅在文本区域中执行搜索,还处理突出显示。以下代码突出显示找到的文本,将插入符号设置为找到的匹配项的末尾,设置文本字段的默认背景,并在状态栏中显示消息。 ``` 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); } } ``` 下表列出了常用的`JTextField`构造函数和方法。您可能调用的其他方法在`JTextComponent`类中定义。请参阅[文本组件 API](textapi.html) 。 您也可以在从文本字段的其他祖先继承的文本字段上调用方法,例如`setPreferredSize`,`setForeground`,`setBackground`,`setFont`等。有关常用继承方法的表,请参见 [JComponent 类](jcomponent.html)。 使用文本字段的 API 属于以下类别: * [设置或获取字段的内容](#contents) * [微调场的外观](#looks) * [实现 Field 的功能](#function) | 方法或构造函数 | 目的 | | --- | --- | | [JTextField()](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#JTextField--) [JTextField(String)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#JTextField-java.lang.String-) [JTextField(String,int)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#JTextField-java.lang.String-int-) [JTextField(int)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#JTextField-int-) | 创建一个文本字段。如果存在,`int`参数指定列中所需的宽度。 `String`参数包含字段的初始文本。 | | [void setText(String)](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#setText-java.lang.String-) [String getText()](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#getText--) _(在`JTextComponent`中定义)_ | 设置或获取文本字段显示的文本。 | | 方法 | 目的 | | --- | --- | | [void setEditable(boolean)](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#setEditable-boolean-) [boolean isEditable()](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#isEditable--) _(在`JTextComponent`中定义)_ | 设置或指示用户是否可以编辑文本字段中的文本。 | | [void setColumns(int);](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#setColumns-int-) [int getColumns()](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#getColumns--) | 设置或获取文本字段显示的列数。这实际上只是计算字段首选宽度的一个提示。 | | [void setHorizo​​ntalAlignment(int);](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#setHorizontalAlignment-int-) [int getHorizo​​ntalAlignment()](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#getHorizontalAlignment--) | 设置或获取文本在其区域内水平对齐的方式。您可以使用`JTextField.LEADING`,`JTextField.CENTER`和`JTextField.TRAILING`作为参数。 | | 方法 | 目的 | | --- | --- | | [void addActionListener(ActionListener)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#addActionListener-java.awt.event.ActionListener-) [void removeActionListener(ActionListener)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html#removeActionListener-java.awt.event.ActionListener-) | 添加或删除动作侦听器。 | | [void selectAll()](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.html#selectAll--) _(在`JTextComponent`中定义)_ | 选择文本字段中的所有字符。 | 此表显示了一些使用文本字段的示例,并指出了描述这些示例的位置。有关各种文本字段(如处理布局)的代码示例,请查看相关组件的示例列表,例如[格式的文本字段](formattedtextfield.html#eg)和[微调器](spinner.html#eg)。 | 例 | 在哪里描述 | 笔记 | | :-- | :-- | :-- | | [TextDemo](../examples/components/index.html#TextDemo) | 这个部分 | 将基本文本字段与动作侦听器一起使用的应用程序。 | | [TextFieldDemo](../examples/components/index.html#TextFieldDemo) | 这个部分 | 使用文本字段和文本区域的应用程序。在文本区域中进行搜索以从文本字段中查找条目。 | | [DialogDemo](../examples/components/index.html#DialogDemo) | [如何制作对话](dialog.html) | `CustomDialog.java`包括其值被检查的文本字段。您可以通过单击“更多对话框”选项卡,选择“输入验证”对话框选项,然后单击“显示”来调出对话框!按钮。 | | [TextSamplerDemo](../examples/components/index.html#TextSamplerDemo) | [使用文本组件](text.html) | 使用`GridBagLayout`和便捷方法布置标签文本字段对: | | `addLabelTextRows(JLabel [] 标签,JTextField [] textFields ,GridBagLayout ]格子袋,容器容器)` | | [TextInputDemo](../examples/components/index.html#TextInputDemo) | [如何使用格式化文本字段](formattedtextfield.html) | 使用`SpringLayout`和`SpringUtilities`便捷方法布置标签文本字段对: | | `makeCompactGrid(容器父,int 行,int cols ,int initialX ,int initialY ,int xPad ,int yPad )` | 如果您使用 JavaFX 进行编程,请参阅[文本字段](https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/text-field.htm)。