2015-03-02 100 views
2

我正在研究Java Swing应用程序。我在JPanel内的JTabbedPane内的JScrollPane内有JTextArea。我可以输入JTextArea,除了回车键之外,键盘上的每个键都具有所需的效果。Enter键在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(); 
    } 
} 
+5

*“我给JTextArea一个新的HTMLDocument”*为什么? 'JTextArea'专为显示纯文本而不是样式文本而设计。使用'JEditorPane'... ... – MadProgrammer 2015-03-02 23:35:39

+1

@MadProgrammer:尽管如此,JTextArea API没有提及其他类型的文档无法使用(尽管我同意,PlainDocument是应该使用的)。 – 2015-03-02 23:37:15

+1

请注意,HTML(渲染应用程序)通常会忽略新的行字符。 – 2015-03-02 23:48:33

回答

2

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 
+0

现在来想一下如何让JTextPane做单词换行......但这是另一个线程的另一个问题。 – DethRaid 2015-03-03 22:25:55