2014-08-27 97 views
2

這個問題似乎是this one的重複,但實際上並非如此。因此,在回答這個問題之前,請澄清是否有任何混淆。在JTextPane中繪製水平線

我想在我的JTextPane中的每6-7行之後繪製一條水平線,我正在使用StyledDocument並在運行時將字符串插入我的JTextPane。例如:

String myStr = "Some program-generated text"; 
doc.insertString(doc.getLength(), myStr, attributeSet); 

現在如何在每隔幾行後繪製一條水平線?我試圖

JTextPane textPane = new JTextPane(); 
textPane.setContentType("text/html"); 
textPane.setText("<html>Some Text Above The Line<hr size=5>Some Text Below</html>"); 

但目前我的應用程序使用setContentType("text/plain");其更改爲Text.html擾亂整個UI。此外,如果我使用SetText()那麼它將被作爲新鮮的文本插入,所有以前的文本將消失,我附加了doc.insertString();

任何幫助將不勝感激。

回答

3

這樣的事情!?

Screenshot of Sample Application

開始通過創建自己的JTextPane的子類。實現繪圖方法並使用Graphics Context中的FontMetrics來獲取文本的高度。

public class MyTextPane extends JTextPane { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D) g; 

     g2.setColor(new Color(255, 0, 0, 128)); 

     FontMetrics fm = g2.getFontMetrics(); 
     int textHeight = fm.getHeight(); 

     for (int i = textHeight; i < getHeight(); i += (6 * textHeight)) { 
      g2.drawLine(0, i + 1, getWidth(), i + 1); 
     } 

     g2.dispose(); 
    } 
} 
+0

你能告訴我怎麼稱呼它嗎? – 2014-08-28 04:50:41

1

您可以通過編輯您的主要方法調用它來調用子類MyTextPane()代替JTextPane()

public static void main(String[] args) { 
    //add your jframe here 
    JFrame frame=new JFrame(); 
    //add component 
    MyTextPane pane1=new MyTextPane(); 
    pane1.setText("text here"); 
    frame.add(pane1); 
    frame.pack(); 
    frame1.setVisible(true); 
}