2015-07-20 35 views
0

我有一個簡單的swing應用程序和兩個JTextPanes。在第一次我寫一個HTML代碼,並在第二我得到這個HTML定義的外觀。我想要有一個允許我在表格中插入一個表格的按鈕。 這裏是我的代碼:插入表格到html文件java swing

public class TestEditor extends JFrame { 
public TestEditor(){ 
    createConnection(); 
    createGUI(); 
} 
private void createGUI(){ 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    JScrollPane scroll1=new JScrollPane(text); 
    JScrollPane scroll2=new JScrollPane(html); 
    JSplitPane split=new JSplitPane(); 
    split.setLeftComponent(scroll1); 
    split.setRightComponent(scroll2); 
    split.setDividerLocation(0.5); 
    split.setResizeWeight(0.5); 
    getContentPane().add(split); 
    table=new JButton("Insert table"); 
    table.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      StringBuilder builder=new StringBuilder("<table border=1>\n"); 
      for(int i=0;i<4;i++){ 
       builder.append("<tr>"); 
       for(int j=0;j<4;j++){ 
        builder.append("<td></td>"); 
       } 
      builder.append("</tr>\n"); 
      } 
      builder.append("</table>\n"); 
      try{ 
       text.getStyledDocument().insertString(text.getCaretPosition(), builder.toString(), null); 
      }catch(BadLocationException ex){ 
       ex.printStackTrace(); 
      } 
     } 
    }); 
    getContentPane().add(table, BorderLayout.SOUTH); 
    setTitle("Test"); 
    setPreferredSize(new Dimension(600,300)); 
    pack(); 
} 
private void createConnection(){ 
    text=new JTextPane(); 
    html=new JTextPane(); 
    html.setContentType("text/html"); 
    html.getStyledDocument().addDocumentListener(new DocumentListener() { 
     @Override 
     public void insertUpdate(DocumentEvent e) { 
      update(); 
     } 
     @Override 
     public void removeUpdate(DocumentEvent e) { 
      update(); 
     } 
     @Override 
     public void changedUpdate(DocumentEvent e) { 
      update(); 
     } 
     private void update(){ 
      if(fromText) return; 
      fromHtml=true; 
      text.setText(html.getText()); 
      fromHtml=false; 
     } 
    }); 
    text.getStyledDocument().addDocumentListener(new DocumentListener() { 
     @Override 
     public void insertUpdate(DocumentEvent e) { 
      update(); 
     } 
     @Override 
     public void removeUpdate(DocumentEvent e) { 
      update(); 
     } 
     @Override 
     public void changedUpdate(DocumentEvent e) { 
      update(); 
     } 
     private void update(){ 
      if(fromHtml) return; 
      fromText=true; 
      html.setText(text.getText()); 
      fromText=false; 
     } 
    }); 
} 

public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new TestEditor().setVisible(true); 
     } 
    }); 
} 
private JTextPane text; 
private JTextPane html; 
private boolean fromHtml, fromText; 
private JButton table; 

}

然而,這種插入表錯了地方,最常見的結束標記</HTML >後。我的目標是將插入的表插入右側編輯器中的插入符號的位置。 我該怎麼辦?如何檢測正確的位置?

回答

1

我測試了您的代碼,並且在編輯樣式化文檔時失敗,但在編輯文本文檔時失敗。原因很簡單:當發生對update()的呼叫時,使用setText()將插入符號放在文檔的末尾。然後html代碼自然會插入到最後。

因此理想情況下,您希望跟蹤插入位置並在setText()後巧妙更新它。但這並不容易:您如何管理插入或刪除的文本?

所以這裏有一個建議:當點擊「添加表」按鈕時,檢測哪個編輯器有焦點(=插入位置相關的位置),並在相應的位置插入html代碼。

然而,風格文檔中插入HTML代碼將稍有不同的做法(避免被轉義):

HTMLEditorKit kit = (HTMLEditorKit) html.getEditorKit(); 
HTMLDocument doc = (HTMLDocument) html.getStyledDocument(); 
kit.insertHTML(doc, html.getCaretPosition(), builder.toString(), 0, 0, null); 

所以,你應該得到類似的東西:

Component c = getFocusOwner(); 
if(c==html){ 
    HTMLEditorKit kit = (HTMLEditorKit) html.getEditorKit(); 
    HTMLDocument doc = (HTMLDocument) html.getStyledDocument(); 
    kit.insertHTML(doc, html.getCaretPosition(), builder.toString(), 0, 0, null); 
}else if(c==text){ 
    text.getStyledDocument().insertString(text.getCaretPosition(), builder.toString(), null); 
} 

此外,請該按鈕不可調焦以避免getFocusOwner()檢測到按鈕點擊:

table.setFocusable(false);