如何使用 Literals 区

JTextArea类提供了一个显示多行文本的组件,并允许用户编辑文本。如果您只需要从用户那里获得一行 Importing,则应使用text field。如果希望文本区域使用多种字体或其他样式显示其文本,则应使用编辑器窗格或文本窗格。如果显示的文本 Long 度有限,并且用户从未对其进行编辑,请使用label

教程的许多示例都使用不可编辑的文本区域来显示程序输出。这是名为TextDemo的示例的图片,使您可以使用文本字段(在顶部)键入文本,然后将键入的文本附加到文本区域(在下面)。

TextDemo 的快照

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 TextDemo。另外,要自己编译和运行示例,请查阅example index

您可以在TextDemo.java中找到该程序的完整代码。以下代码创建并初始化文本区域:

textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane(textArea); 
textArea.setEditable(false);

JTextArea构造函数的两个参数分别提示文本区域应显示的行数和列数。当确定滚动窗格的大小时,包含文本区域的滚动窗格会注意这些提示。

如果不创建滚动窗格,则文本区域将不会自动滚动。上一片段中显示的JScrollPane构造函数设置了要在滚动窗格中查看的文本区域,并指定了在需要时滚动窗格的滚动条应可见。如需进一步的信息,请参见如何使用滚动窗格

默认情况下,文本区域是可编辑的。代码setEditable(false)使文本区域不可编辑。它仍然是可选的,用户可以从中复制数据,但是用户不能直接更改文本区域的内容。

以下代码将文本添加到文本区域。注意,文本系统内部使用' n'字符表示换行符;有关详细信息,请参见DefaultEditorKit的 API 文档。

private final static String newline = "\n";
...
textArea.append(text + newline);

除非用户通过在文本区域中单击或拖动来移动插入符号(插入点),否则文本区域将自动滚动以使附加的文本可见。您可以通过在调用append之后将插入标记移动到文本区域的末尾来迫使文本区域滚动到底部:

textArea.setCaretPosition(textArea.getDocument().getLength());

自定义文本区域

您可以通过多种方式自定义文本区域。例如,尽管给定的文本区域只能以一种字体和颜色显示文本,但是您可以设置其使用的字体和颜色。可以在任何组件上执行此定制选项。您还可以确定文本区域如何换行以及每个选项卡的字符数。最后,您可以使用JTextArea类从JTextComponent类继承的方法来设置属性,例如插入符号,对拖动的支持或颜色选择。

以下来自TextSamplerDemo.java的代码演示了如何初始化可编辑文本区域。文本区域使用指定的斜体字体,并在单词之间换行。

JTextArea textArea = new JTextArea(
    "This is an editable JTextArea. " +
    "A text area is a \"plain\" text component, " +
    "which means that although it can display text " +
    "in any font, all of the text is in the same font."
);
textArea.setFont(new Font("Serif", Font.ITALIC, 16));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);

默认情况下,文本区域不会换行对于显示区域而言过 Long 的行。相反,它对换行符之间的所有文本使用一行,并且-如果文本区域在scroll pane内-允许其水平滚动。本示例通过调用setLineWrap方法打开换行,然后调用setWrapStyleWord方法以指示文本区域应在单词边界而不是字符边界处换行。

为了提供滚动功能,该示例将文本区域放在滚动窗格中。

JScrollPane areaScrollPane = new JScrollPane(textArea);
areaScrollPane.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
areaScrollPane.setPreferredSize(new Dimension(250, 250));

您可能已经注意到,此示例中使用的JTextArea构造函数未指定行数或列数。相反,该代码通过设置滚动窗格的首选大小来限制文本区域的大小。

另一个示例:TextAreaDemo

TextAreaDemo示例引入了具有特殊功能的可编辑文本区域-单词补全功能。当用户键入单词时,只要程序的词汇表中包含以键入的单词开头的单词,该程序就会提示您完成单词的提示。这是TextAreaDemo应用程序的图片。

TextAreaDemo 的快照

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 TextAreaDemo。另外,要自己编译和运行示例,请查阅example index

您可以在TextAreaDemo.java中找到该程序的完整代码。

本示例使用默认滚动条策略为文本区域提供滚动能力。默认情况下,垂直滚动条仅在显示区域完全充满文本且没有空间添加新单词时显示。您可以使用以下代码提供这种类型的滚动窗格:

textArea.setWrapStyleWord(true);
  jScrollPane1 = new JScrollPane(textArea);

如上所述,文本区域是可编辑的。您可以通过键入和粘贴文本,或删除文本的某些部分或整个内容来使用文本区域。另外,请try使用标准键绑定在文本区域内编辑文本。

现在探讨单词完成功能是如何实现的。Importing“ Swing”或“ special”之类的词。键入“ sw”后,程序将以浅蓝色突出显示可能的完成“ ing”。按 Enter 接受完成或 continueImporting。

以下代码将文档侦听器添加到文本区域的文档中:

textArea.getDocument().addDocumentListener(this);

当您开始键入单词时,insertUpdate方法将检查程序的词汇表中是否包含键入的前缀。找到前缀的完成后,对invokeLater方法的调用将提交一个任务,以便以后更改文档。重要的是要记住,您不能在文档事件通知中修改文档,否则会出现异常。检查以下代码。

String prefix = content.substring(w + 1).toLowerCase();
int n = Collections.binarySearch(words, prefix);
if (n < 0 && -n <= words.size()) {
    String match = words.get(-n - 1);
    if (match.startsWith(prefix)) {
        // A completion is found
        String completion = match.substring(pos - w);
        // We cannot modify Document from within notification,
        // so we submit a task that does the change later
        SwingUtilities.invokeLater(
            new CompletionTask(completion, pos + 1));
    }
} else {
    // Nothing found
    mode = Mode.INSERT;
}

粗体显示的代码说明了如何创建选择。插入符号首先设置为完整单词的末尾,然后移至最后键入字符之后的位置。 moveCaretPosition方法不仅将插入符号移动到新位置,而且还在两个位置之间选择文本。完成任务通过以下代码实现:

private class CompletionTask implements Runnable {
        String completion;
        int position;
        
        CompletionTask(String completion, int position) {
            this.completion = completion;
            this.position = position;
        }
        
        public void run() {
            textArea.insert(completion, position);
            textArea.setCaretPosition(position + completion.length());
            textArea.moveCaretPosition(position);
            mode = Mode.COMPLETION;
        }
    }

文本区域 API

下表列出了常用的JTextArea构造函数和方法。您可能会调用的其他方法在JTextComponent中定义,并在Literals 元件 API中列出。

您可能还会在从其其他祖先继承的文本区域上调用方法,例如setPreferredSizesetForegroundsetBackgroundsetFont等。有关常用继承方法的表,请参见JComponent 类

使用文本区域的 API 包括以下类别:

设置或获取内容

方法或构造函数Purpose
JTextArea()

JTextArea(String)
JTextArea(字符串,整数,整数)
JTextArea(int, int)
创建文本区域。如果存在,则String参数包含初始文本。 int参数分别以列为单位指定所需的宽度,以行为单位指定所需的高度。
void setText(String)
String getText()
(在JTextComponent中定义)
设置或获取由文本区域显示的文本。

微调文本区域的外观

MethodPurpose
void setEditable(boolean)

boolean isEditable()
(在JTextComponent中定义)
设置或指示用户是否可以编辑文本区域中的文本。
void setColumns(int);
int getColumns()
设置或获取文本区域显示的列数。这实际上只是计算区域首选宽度的提示。
void setRows(int);
int getRows()
设置或获取文本区域显示的行数。这是计算该区域首选高度的提示。
int setTabSize(int)设置选项卡等效的字符数。
int setLineWrap(boolean)设置如果线条太 Long 而无法容纳在分配的宽度内,则是否换行。默认情况下,此属性为 false,并且不对行进行换行。
int setWrapStyleWord(boolean)设置是否可以在空格(单词边界)或任何字符处换行。缺省情况下,此属性为 false,并且可以在任何字符处换行(如果启用了换行)。

实现文本区域的功能

MethodPurpose
void selectAll()

(在JTextComponent中定义)
选择文本区域中的所有字符。
void append(String)将指定的文本添加到文本区域的末尾。
void insert(String,int)将指定的文本插入指定的位置。
void replaceRange(String,int,int)用指定的字符串 替换指示位置之间的文本。
int getLineCount()
int getLineOfOffset(int)
int getLineStartOffset(int)
int getLineEndOffset(int)
用于查找行号或指定行的开头或结尾位置的 Util。

使用文本区域的示例

下表列出了使用文本区域的示例,并指向描述这些示例的位置。

ExampleWhere DescribedNotes
TextDemoThis section将用户 Importing 的文本附加到文本区域的应用程序。
TextAreaDemoThis section具有文本区域和单词完成功能的应用程序。
TextSamplerDemo使用 Literals 组件使用每个 Swing 文本组件之一。
HtmlDemo如何在 Swing 组件中使用 HTML文本区域,使用户能够键入要在标签中显示的 HTML 代码。
BasicDnDDnD 简介演示几个 Swing 组件的内置拖放功能,包括文本区域。
FocusConceptsDemo如何使用 Focus 子系统使用几个包含文本区域的组件演示焦点的工作原理。