如何在不刷新整个窗格的情况下附加到JEditorPane?

时间:2018-01-29 12:06:38

标签: java html swing user-interface jeditorpane

这是我目前将文字附加到我的JEditorPane editorPane的方法。 hmtl是一个String,用于存储JEditorPane中的HTML文本,line是一个String,用于存储我想要添加到<body>末尾的HTML文本。

// Edit the HTML to include the new String:
html = html.substring(0, html.length()-18);
html += "<br>"+line+"</p></body></html>";

editorPane.setText(html); // Add the HTML to the editor pane.

这基本上只是编辑HTML代码并重置JEditorPane,这是一个问题,因为这意味着整个JEditorPane刷新,使图像重新加载,文本闪存等。如果可能,我想停止它。

所以我的问题是,如何在不刷新整个窗格的情况下附加到JEditorPane?

我正在使用JEditorPane,因为它可以显示HTML,欢迎任何替代方案。

2 个答案:

答案 0 :(得分:3)

另一种选择是使用HTMLDocument#insertBeforeEnd(...) (Java Platform SE 8)

  

在元素的末尾插入指定为字符串的HTML。

import java.awt.*;
import java.io.IOException;
import java.time.LocalTime;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;

public class EditorPaneInsertTest {
  private Component makeUI() {
    HTMLEditorKit htmlEditorKit = new HTMLEditorKit();
    JEditorPane editor = new JEditorPane();
    editor.setEditorKit(htmlEditorKit);
    editor.setText("<html><body id='body'>image</body></html>");
    editor.setEditable(false);

    JButton insertBeforeEnd = new JButton("insertBeforeEnd");
    insertBeforeEnd.addActionListener(e -> {
      HTMLDocument doc = (HTMLDocument) editor.getDocument();
      Element elem = doc.getElement("body");
      String line = LocalTime.now().toString();
      String htmlText = String.format("<p>%s</p>", line);
      try {
        doc.insertBeforeEnd(elem, htmlText);
      } catch (BadLocationException | IOException ex) {
        ex.printStackTrace();
      }
    });

    Box box = Box.createHorizontalBox();
    box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    box.add(Box.createHorizontalGlue());
    box.add(insertBeforeEnd);

    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(editor));
    p.add(box, BorderLayout.SOUTH);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new EditorPaneInsertTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

答案 1 :(得分:2)

在文档中进行修改。

// Styling...
SimpleAttributeSet attributes = new SimpleAttributeSet();
StyleConstants.setBold(attributes, true);
StyleConstants.setItalic(attributes, true);

text.getDocument().insertString(document.getLength(), "Hello www.java2s.com", attributes);