2012-10-03 12 views
5

Próbuję użyć JEditorPane do wyświetlenia tekstu HTML. Z jakiegoś powodu muszę użyć metody setText(). Jednak powoduje to migotanie JEditorPane. Powodem jest to, że za każdym razem po aktualizacji editorPane.setText (msgBuffer); Muszę doprowadzić kursor do końca dokumentu editorPane.setCaretPosition ((editorPane.getDocument()). GetLength() - 1) as Chcę, aby ostatnia linia tekstu pojawiła się na dole dokumentu. Mam dla was cały kod, żebyście mogli go zobaczyć. Widziałem wiele zaleceń, aby używać document.insertString, ale w tym przypadku muszę użyć poszczególnych atrybutów, które nie są z mojego zainteresowania. Czy jest jakiś sposób, aby ten kod działał bez migotania?Wyświetlanie HTML w JEditorPane przy użyciu jEditor.setText() powoduje migotanie

import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.text.Document; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.StyleSheet; 

public class CMessageWindow { 

    private static final String ERROR = "ERROR"; 
    private static final String MESSAGE = "msg"; 
    private JScrollPane scrollPane; 
    public JEditorPane editorPane; 
    private HTMLEditorKit kit; 
    private String msgBuffer=new String(""); 
    private static CMessageWindow window=null; 
    private static JFrame frameContainer=null; 

    private CMessageWindow() 
    { 
     editorPane = new JEditorPane(); 
     editorPane.setEditable(false); 
     editorPane.setContentType("text/html"); 
     kit = new HTMLEditorKit(); 
     editorPane.setEditorKit(kit); 

     StyleSheet styleSheet = kit.getStyleSheet(); 
     styleSheet.addRule("."+MESSAGE+" {font: 10px monaco; color: black; }"); 
     styleSheet.addRule("."+ERROR+" {font: 10px monaco; color: #ff2222; background-color : #cccccc; }"); 

     Document doc = kit.createDefaultDocument(); 
     editorPane.setDocument(doc); 
     scrollPane = new JScrollPane(editorPane); 
    } 
    public static CMessageWindow getInstance(){ 
     if (null==window) 
     {window=new CMessageWindow();} 
     return window; 
    } 
/** 
* The core 
* @param sMessage 
* @param sType 
*/ 
    private void updateMessages(final String sMessage, final String sType) 

    { 
     String sMessageHTML=""; 
     String sTypeText=""; 
     if (!sMessage.equals("\r\n")){ 
      sTypeText = sType+": "; 
     } 

     sMessageHTML = sMessage.replaceAll("(\r\n|\n)", "<br/>"); 
     if (!sMessageHTML.equals("<br/>")) 
     { 
      sMessageHTML = "<SPAN CLASS="+sType+">"+ sTypeText+sMessageHTML + "</SPAN>"; 
     } 

     msgBuffer=msgBuffer.concat(sMessageHTML); 
     editorPane.setText(msgBuffer); 
     if ((editorPane.getDocument()).getLength()>1){ 
      editorPane.setCaretPosition((editorPane.getDocument()).getLength()-1); 
     } 
    } 

    public void setContainerFrame(JFrame jFrame){ 
     frameContainer = jFrame; 
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(frameContainer.getContentPane()); 
     frameContainer.getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(scrollPane) 
       ); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
         .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 217, Short.MAX_VALUE)) 
       ); 
    } 

    public void setVisible(boolean bVisible){ 
     editorPane.setVisible(bVisible); 
     scrollPane.setVisible(bVisible); 
    } 

    public void printMsg(String sMessage){ 
     String sType = MESSAGE; 
     updateMessages(sMessage,sType); 
    } 

    public void printlnMsg(String sMessage){ 
     sMessage=sMessage.concat("\r\n"); 
     printMsg(sMessage); 
    } 

    public void printErr(String sMessage){ 
     String sType = ERROR; 
     updateMessages(sMessage,sType); 
    } 

    public void printlnErr(String sMessage){ 
     sMessage=sMessage.concat("\r\n"); 
     printErr(sMessage); 
    } 

    public static void main(String args[]){ 
     CMessageWindow m_LogMgr; 
     JFrame frame = new JFrame(); 
     m_LogMgr=CMessageWindow.getInstance(); 
     m_LogMgr.setContainerFrame(frame); 
     frame.setVisible(true); 
     frame.setSize(500, 500); 

     for(int i=0;i<20;++i){ 
      m_LogMgr.printlnErr("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"); 
     } 

     for(int i=0;i<150;++i){ 
      try { 
       Thread.sleep(20); 
      } catch (Exception e) { 
      } 
      m_LogMgr.printlnMsg("-----------------------"); 
     } 

    } 


} 

Odpowiedz

5

Nie należy modyfikować komponentów interfejsu użytkownika poza funkcją EDT.

Jeśli dodasz połączenie wewnętrzne, powiedzmy, twoje updateMessages, aby aktualizacja została wykonana na EDT, wtedy migotanie zniknie.

Na przykład:

private void updateMessages(final String sMessage, final String sType) 

{ 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      String sMessageHTML=""; 
      String sTypeText=""; 
      if (!sMessage.equals("\r\n")){ 
       sTypeText = sType+": "; 
      } 
      sMessageHTML = sMessage.replaceAll("(\r\n|\n)", "<br/>"); 
      if (!sMessageHTML.equals("<br/>")) 
      { 
       sMessageHTML = "<SPAN CLASS="+sType+">"+ sTypeText+sMessageHTML + "</SPAN>"; 
      } 

      msgBuffer=msgBuffer.concat(sMessageHTML); 
      editorPane.setText(msgBuffer); 
      if ((editorPane.getDocument()).getLength()>1){ 
       editorPane.setCaretPosition((editorPane.getDocument()).getLength()-1); 
      } 
     } 
    }); 
} 

pamiętać, że nie należy wykonywać długich operacji działa na EDT, bo inaczej będziesz „lock” swoje UI.

+0

lub bez zmian widocznych GUI – mKorbel

0

Jeśli masz długi bieg IO i aktualizację GUI potem można użyć zamiast SwingWorker (patrz http://en.wikipedia.org/wiki/Event_dispatching_thread)

SwingWorker<Document, Void> worker = new SwingWorker<Document, Void>() { 
    public Document doInBackground() throws IOException { 
     return loadXML(); // heavy task 
    } 

    public void done() { 
     try { 
      Document doc = get(); 
      display(doc); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}; 
worker.execute(); 
Powiązane problemy