2014-08-27 67 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); 
}