JTextPaneで修飾したテキストをJTextAreaにHtmlソースとして表示する
Total: 7576, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
HTMLEditorKitを使用するJTextPaneで修飾したテキストをJTextAreaにHtmlソースとして表示、編集、JTextPaneに反映するテストを行なっています。
Screenshot

Advertisement
Source Code Examples
textPane.setComponentPopupMenu(new HTMLColorPopupMenu());
// textPane.setEditorKit(new HTMLEditorKit());
textPane.setContentType("text/html");
textArea.setText(textPane.getText());
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("JTextPane", new JScrollPane(textPane));
tabbedPane.addTab("JTextArea", new JScrollPane(textArea));
tabbedPane.addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
JTabbedPane t = (JTabbedPane) e.getSource();
int i = t.getSelectedIndex();
try {
if (i == 0) {
textPane.setText(textArea.getText());
} else {
String str = textPane.getText();
textArea.setText(str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
t.revalidate();
}
});
View in GitHub: Java, KotlinDescription
HTMLEditorKitを使用(コンテンツ形式をtext/htmlに設定)するJTextPaneでJEditorPane#getText()を実行すると、HTMLEditorKitから文字色などのStyleを設定したHtmlソースとして文字列を取得可能なので、JTabbedPaneがJTextAreaに切り替わるときにJTextAreaに流し込んでいます。
逆に、JTextAreaでHtmlソースを編集してJTabbedPaneでJTextPaneに切り替える時には、JEditorPane#setText(String)内でHTMLEditorKitにHTML形式で読み込まれるよう設定しています。
textPane.setContentType("text/html");とコンテンツ形式を設定しておかないとJEditorPane#setText(String)でDocumentが更新されない場合がある?- この場合以下のように
textPane.setText(textArea.getText());ではなくHTMLEditorKit#insertHTML(...)を使用する// textPane.setText(textArea.getText()); textPane.setText(""); HTMLEditorKit hek = (HTMLEditorKit) textPane.getEditorKit(); HTMLDocument doc = (HTMLDocument) textPane.getStyledDocument(); hek.insertHTML(doc, 0, textArea.getText(), 0, 0, null);
HTMLEditorKitからHTML Tagを取り除いた文字列を取得するサンプル
// import java.io.StringReader;
// import javax.swing.text.html.parser.*;
ParserDelegator delegator = new ParserDelegator();
StringBuffer s = new StringBuffer();
delegator.parse(new StringReader(str), new HTMLEditorKit.ParserCallback() {
@Override public void handleText(char[] text, int pos) {
s.append(text);
}
}, Boolean.TRUE);
System.out.println(s.toString());