在JTextPane中绘制水平线

时间:2014-08-27 19:16:55

标签: java swing user-interface jtextarea

问题似乎与this one重复,但实际上并非如此。因此,在对此问题进行贬低之前,请澄清是否存在任何混淆。

我希望在我的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会干扰整个用户界面。此外,如果我使用SetText(),那么它将作为新文本插入,所有之前的文本都将被删除,我附加doc.insertString();

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

这样的东西!?

Screenshot of Sample Application

首先创建自己的JTextPane子类。实现draw方法并使用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();
    }
}

答案 1 :(得分:1)

你可以通过编辑main方法来调用它来调用MyTextPane()子类而不是JTextPane() I.e。

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);
}