2014-10-30 94 views
0

我目前正在編寫一個程序,它接受JTextPane中的樣式文本,並在不可編輯的情況下顯示相同的樣式文本JTextPane.問題是我實際上想要在輸入和顯示之間解析文檔。基本上我希望能夠在保持格式化的同時將DefaultStyledDocument分成兩個文檔。 我該怎麼做?Splitting StyledDocument

SSCE龍虎鬥點:

import java.awt.Color; 
import javax.swing.text.DefaultStyledDocument; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 


public class SSCCE extends javax.swing.JFrame { 


    public SSCCE() { 
     initComponents(); 
     try { 
     DefaultStyledDocument doc = new DefaultStyledDocument(); 
     SimpleAttributeSet attr = new SimpleAttributeSet(); 
     StyleConstants.setBold(attr, true); 
     doc.insertString(0, "This is bold.\n\n", attr); 
     StyleConstants.setItalic(attr, true); 
     doc.insertString(doc.getLength() - 1, "This is bold and italicized.\n", attr); 
     doc.insertString(doc.getLength() - 1, "--\n", null); //This is a delimeter, for splitting the doucment 
     StyleConstants.setBold(attr, false); 
     StyleConstants.setForeground(attr, Color.red); 
     doc.insertString(doc.getLength() - 1, "This is italicized and red.\n", attr); 
     StyleConstants.setBold(attr, true); 
     StyleConstants.setItalic(attr, false); 
     doc.insertString(doc.getLength() -1 , "This is bold and red.\n", attr); 
     txpInput.setDocument(doc); //txpInput is a JTextPane 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @SuppressWarnings("unchecked")      
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jPanel1 = new javax.swing.JPanel(); 
     jScrollPane2 = new javax.swing.JScrollPane(); 
     txpInput = new javax.swing.JTextPane(); 
     jScrollPane3 = new javax.swing.JScrollPane(); 
     txpOutput1 = new javax.swing.JTextPane(); 
     jLabel1 = new javax.swing.JLabel(); 
     btnOutput = new javax.swing.JButton(); 
     jScrollPane4 = new javax.swing.JScrollPane(); 
     txpOutput2 = new javax.swing.JTextPane(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jScrollPane2.setViewportView(txpInput); 

     txpOutput1.setEditable(false); 
     jScrollPane3.setViewportView(txpOutput1); 

     jLabel1.setText("Output:"); 

     btnOutput.setText("Output"); 
     btnOutput.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       btnOutputActionPerformed(evt); 
      } 
     }); 

     txpOutput2.setEditable(false); 
     jScrollPane4.setViewportView(txpOutput2); 

     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.TRAILING) 
        .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .addComponent(jScrollPane2) 
        .addGroup(jPanel1Layout.createSequentialGroup() 
         .addComponent(btnOutput, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(0, 462, Short.MAX_VALUE)) 
        .addComponent(jScrollPane4)) 
       .addContainerGap()) 
     ); 
     jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jLabel1) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(btnOutput) 
       .addGap(9, 9, 9) 
       .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(79, Short.MAX_VALUE)) 
     ); 

     jScrollPane1.setViewportView(jPanel1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1) 
     ); 

     pack(); 
    }       

    private void btnOutputActionPerformed(java.awt.event.ActionEvent evt) {           
     //Comment out the body of this method to get code to run 
     //This needs to parse the text and output it to the two output JTextPanes 
     DefaultStyledDocument inputDoc = (DefaultStyledDocument) txpInput.getDocument(); 
     DefaultStyledDocument[] output = inputDoc.split("--"); //Invalid, is there an equivalent 
     txpOutput1.setDocument(ouput[0]); 
     txpOutput2.setDocument(ouput[1]); 
     this.validate(); 
     this.repaint(); 
    }           

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     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(SSCCE.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(SSCCE.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(SSCCE.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(SSCCE.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     }  
     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new SSCCE().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton btnOutput; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JScrollPane jScrollPane2; 
    private javax.swing.JScrollPane jScrollPane3; 
    private javax.swing.JScrollPane jScrollPane4; 
    private javax.swing.JTextPane txpInput; 
    private javax.swing.JTextPane txpOutput1; 
    private javax.swing.JTextPane txpOutput2; 
    // End of variables declaration     
} 

注:我使用NetBeans GUI生成器,因此長生成的代碼。

基本上,在這個例子中,我輸入了一些格式化的文本到輸入JTextPane。然後,我希望能夠將格式化的文本分割爲兩個輸出窗格,而不會丟失格式。在SCCE中,當用戶按下「Output」按鈕時,數據應該被複制,被--行分割。在這個例子中,我使用了不存在的split()方法,但我認爲它可以解決這個問題。

這是預期的輸入(這個特殊的例子): enter image description here

而且這是預期的輸出: enter image description here

我本來以爲this問題有一個可能的答案。但我試過了,發現它不起作用。所以最後,我如何在保持樣式的同時分割樣式文檔。

回答

0

從相同的內容源創建StyledDocument的2個副本。

查找文檔分隔符。

在第一個文檔中刪除分隔符之前的所有內容。

在第二個文檔中刪除分隔符後面的所有內容。

更新:您可以使用the code合併文檔,但有2個目標文檔,並根據您的過濾規則將源文檔的插入重定向到期望的實例。

+0

如何獲得兩份文件?我從JTextPane獲取文檔。它只會傳遞給我一個_one_文檔的參考。 – DonyorM 2014-12-10 04:45:14

+0

您可以創建它 - 新的EditorKitDependentDocument或textPane.getEditorKit()。createDefaultDocument() – StanislavL 2014-12-10 05:33:56

相關問題