2014-07-09 85 views
0

我做了一個拼寫檢查器類的東西。在這段代碼中,當用戶點擊一個鏈接時,出現一個選項列表,當選擇一個選項時,超鏈接中的文本被更新。 我的問題是,當我更新第一個單詞時,它消失了。我正在爲它寫一個示例工作代碼。單詞「鏈接」是可點擊的。當使用kit.insertHTML()更新時,jTextPane中的第一個字消失()

import java.awt.ComponentOrientation; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JEditorPane; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
import javax.swing.event.HyperlinkEvent; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.html.HTML; 
import javax.swing.text.html.HTMLDocument; 
import javax.swing.text.html.HTMLEditorKit; 

public class TextPaneTesting1 extends javax.swing.JFrame { 

    /** 
    * Creates new form TextPaneTesting 
    */ 
    static HTMLEditorKit kit = new HTMLEditorKit(); 
    static HTMLDocument doc = new HTMLDocument(); 
    static String mainText; 

    public TextPaneTesting1() throws IOException { 
     initComponents(); 
     jTextPane1.setEditorKit(kit); 
     jTextPane1.setDocument(doc); 
     mainText = "<a href = '#'>Link</a> NotLink <a href = '#'>Link</a> NotLink <a href = '#'>Link</a>."; 
     jTextPane1.setEditable(false); 
     jTextPane1.setText(mainText); 
     jTextPane1.setCaretPosition(0); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTextPane1 = new javax.swing.JTextPane(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jTextPane1.setContentType("text/UTF-8"); // NOI18N 
     jTextPane1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N 
     jTextPane1.addHyperlinkListener(new javax.swing.event.HyperlinkListener() { 
      public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) { 
       jTextPane1HyperlinkUpdate(evt); 
      } 
     }); 
     jScrollPane1.setViewportView(jTextPane1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 613, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jTextPane1HyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {           
     if(evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED){ 
      int begin = evt.getSourceElement().getStartOffset(); 
      int end = evt.getSourceElement().getEndOffset(); 
      popup = new JPopupMenu(); 
      JMenuItem listOption = new JMenuItem("Click It"); 
      listOption.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 12)); 
      listOption.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        try { 
         updateText(begin, end); 
        } catch (IOException ex) { 
         Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
      }); 
      popup.add(listOption); 
      popup.show(jTextPane1, jTextPane1.getMousePosition().x, jTextPane1.getMousePosition().y); 
     } 
    }           

    static void updateText(int begin, int end) throws IOException{ 
     try { 
      doc.remove(begin, end - begin); 
      String replaced = "<a href = '#'>Replaced</a>"; 
      kit.insertHTML((HTMLDocument) doc, begin, replaced, 0, 0, HTML.Tag.A); 
     } catch (BadLocationException ex) { 
      Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new TextPaneTesting1().setVisible(true); 
       } catch (IOException ex) { 
        Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JScrollPane jScrollPane1; 
    private static javax.swing.JTextPane jTextPane1; 
    // End of variables declaration     
    private javax.swing.JPopupMenu popup; 
} 

回答

1

我用了HTMLDocument代替

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
import javax.swing.event.HyperlinkEvent; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Element; 
import javax.swing.text.html.HTMLDocument; 
import javax.swing.text.html.HTMLEditorKit; 

public class TextPaneTesting1 extends javax.swing.JFrame { 

    /** 
    * Creates new form TextPaneTesting 
    */ 
    static HTMLEditorKit kit = new HTMLEditorKit(); 
    static HTMLDocument doc = new HTMLDocument(); 
    static String mainText; 

    public TextPaneTesting1() throws IOException { 
     initComponents(); 
     jTextPane1.setEditorKit(kit); 
     doc=(HTMLDocument)jTextPane1.getDocument(); 
     mainText = "<a href = '#'>Link</a> NotLink <a href = '#'>Link</a> NotLink <a href = '#'>Link</a>."; 
     jTextPane1.setEditable(false); 
     jTextPane1.setText(mainText); 
     jTextPane1.setCaretPosition(0); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTextPane1 = new javax.swing.JTextPane(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jTextPane1.setContentType("text/UTF-8"); // NOI18N 
     jTextPane1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N 
     jTextPane1.addHyperlinkListener(new javax.swing.event.HyperlinkListener() { 
      public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) { 
       jTextPane1HyperlinkUpdate(evt); 
      } 
     }); 
     jScrollPane1.setViewportView(jTextPane1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 613, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jTextPane1HyperlinkUpdate(final javax.swing.event.HyperlinkEvent event) { 
     if(event.getEventType() == HyperlinkEvent.EventType.ACTIVATED){ 
      popup = new JPopupMenu(); 
      JMenuItem listOption = new JMenuItem("Click It"); 
      listOption.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 12)); 
      listOption.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        try { 
         updateText(event.getSourceElement()); 
        } catch (IOException ex) { 
         Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
      }); 
      popup.add(listOption); 
      popup.show(jTextPane1, jTextPane1.getMousePosition().x, jTextPane1.getMousePosition().y); 
     } 
    } 

    static void updateText(Element elem) throws IOException{ 
     try { 
      final int begin = elem.getStartOffset(); 
      final int end = elem.getEndOffset(); 

      String replaced = "<a href = '#'>Replaced</a>"; 

      doc.insertBeforeStart(elem, replaced); 
      doc.remove(begin+"Replaced".length(), end - begin); 
     } catch (BadLocationException ex) { 
      Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTesting1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new TextPaneTesting1().setVisible(true); 
       } catch (IOException ex) { 
        Logger.getLogger(TextPaneTesting1.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JScrollPane jScrollPane1; 
    private static javax.swing.JTextPane jTextPane1; 
    // End of variables declaration     
    private javax.swing.JPopupMenu popup; 
} 
+0

我已經嘗試過這種insertBeforStart()命令的insertBeforeStart()方法,但我得到的錯誤 異常在線程 「AWT-EventQueue的 - 0」 的java.lang .IllegalStateException:在此函數調用時沒有HTMLEditorKit.Parser 。 –

+0

我忘了將'jTextPane1.setDocument(doc);'改成'doc =(HTMLDocument)jTextPane1.getDocument();'。它現在有效。謝謝:) –

+0

沒有解析器,因爲你創建了EditorKit範圍內的文檔。所以它沒有正確初始化。 – StanislavL

相關問題