【问题标题】:Enter key not working in JTextArea输入键在 JTextArea 中不起作用
【发布时间】:2015-05-03 11:48:36
【问题描述】:

我正在开发一个 Java Swing 应用程序。我在JScrollPane 里面有一个JTextArea 在一个JTabbedPane 在一个JPanel 里面。我可以输入JTextArea,我键盘上的每个键都有想要的效果,除了回车键。

制表符和空格可以正常工作。当我按下回车键,然后在启用自动换行的情况下输入到行尾时,我输入回车键的地方断了行,这让我相信问题出在JTextArea 显示文本的方式上。我给JTextArea 一个新的HTMLDocument。请注意,当我不给JTextArea 提供新的HTMLDocument 时,回车键效果很好。

重现问题的简单代码:

import javax.swing.*;
import javax.swing.text.html.HTMLDocument;
import java.awt.*;

public class Driver extends JFrame {
    public Driver() {
        setLayout( new GridLayout( 1, 1 ) );

        JTabbedPane tabbedPane = new JTabbedPane();
        add( tabbedPane );

        JTextArea textArea = new JTextArea( new HTMLDocument() );
        textArea.setLineWrap( true );

        JScrollPane scrollPane = new JScrollPane( textArea );
        tabbedPane.addTab( "No enter key!", scrollPane );

        pack();
        getContentPane().setVisible( true );
        setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
        setSize( 640, 480 );
        setVisible( true );
        setFocusable( true );
    }

    public static void main( String[] args ) {
        new Driver();
    }
}

【问题讨论】:

  • “我要给 JTextArea 一个新的 HTMLDocument” 为什么? JTextArea 设计用于显示纯文本,而不是样式文本。为此使用JEditorPane...
  • @MadProgrammer:不过,JTextArea API 并没有提到不能使用其他类型的 Documents(虽然我同意,应该使用 PlainDocument)。
  • 请注意,(一个)HTML(渲染应用程序)通常会忽略换行符。
  • @HovercraftFullOfEels 可能不是,没有人说你不能将StyledDocument 应用于JTextField,但这也不起作用;)
  • @MadProgrammer 我尝试了一个 JTextPane,结果相似,但它不允许自动换行。我最初使用 JTextArea 是因为我对 Swing 不是很熟悉,而且它似乎可以很好地与 HTMLDocument 配合使用。

标签: java swing input jtextarea enter


【解决方案1】:

JTextArea 不理解HTMLDocument - 它不适用于样式化文档。您必须将JTextPaneHTMLEditorKit 一起使用,以便它知道它是HTML。出于某种原因,您无法提供自己的文档,但如果您从组件中获取文档,它就可以正常工作。

    final HTMLEditorKit htmlKit = new HTMLEditorKit();
    final JTextPane textPane = new JTextPane( );
    textPane.setEditorKit(htmlKit);
    textPane.setEditable(true);
    JScrollPane scrollPane = new JScrollPane( textPane );

    Document doc = textPane.getDocument();
    System.out.println(doc.getClass().getName()); // It's an HTML Document

【讨论】:

  • 现在要弄清楚如何让 JTextPane 进行自动换行...但这是另一个线程的另一个问题。
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 2014-09-27
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多