获取JTextPane内容的高度

时间:2016-12-20 15:16:22

标签: java swing jtextpane

主要思想是使用Swing库绘制一个特定的表单(它将用于生成图像,它将被转移到escpos打印机,但这是另一个问题)。表单本身顶部有一个全宽容器,代表标签。标签有自定义字体,字体大小,可以有一个linewrap,因此我使用了JTextPane。 JTextPane元素和所有形式的固定大小都是500px。

作为测试,代码如下:

JFrame fr = getFrame();

    JPanel root = new JPanel(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();

    JPanel titleP = new JPanel(new BorderLayout());
    titleP.setBorder(BorderFactory.createTitledBorder("titleP"));
    c.fill = GridBagConstraints.BOTH;
    c.gridy = 0;
    c.gridx = 0;
    c.gridwidth = 8;
    c.weightx = 1.0f;
    c.weighty = 1.0f;

    JTextPane tp = new JTextPane();
    JScrollPane sp = new JScrollPane(tp);
    Font font = new Font("Arial",Font.BOLD, 37);
    tp.setFont(font);
    tp.setText("fdsfdsf sdf sdf sd fdsfsdf sdf sd fsd fdsf sdf sdf sdf sdf sdf sdf sdf ds");
    tp.setOpaque(false);
    titleP.add(sp);

    root.add(titleP,c);

    JPanel infoP = new JPanel();
    infoP.setBorder(BorderFactory.createTitledBorder("infoP"));

    c.gridwidth = 5;
    c.gridy = 1;
    c.gridx = 0;

    //infoP.setPreferredSize(new Dimension(350,200));

    root.add(infoP,c);

    JPanel priceP = new JPanel();
    priceP.setBorder(BorderFactory.createTitledBorder("priceP"));

    c.gridx = 5;
    c.gridwidth = 3;

    root.add(priceP,c);

    fr.setContentPane(root);
    fr.pack();

    int size1 = fr.getHeight();
    int width = 120;
    fr.setSize(width, 0);
    size1 += tp.getHeight();
    size1 += 25;
    fr.setSize(width, size1);
    fr.setVisible(true);

问题是,我如何计算JTextPane的全尺寸,以便将其高度设置为持有它的容器?我硬编码试图给出高度校正的部分,甚至工作,但后来我添加了字体......

2 个答案:

答案 0 :(得分:2)

我在类似的问题上写了详细的答案。查看here

我们的想法是,在JTextPane上调用getPreferredSize()。height将返回在给定当前宽度时显示当前内容所需的高度。如果宽度尚未设置,如果JTP的宽度是最长线的宽度,它将返回所需的高度。

使用相同的逻辑,getPreferredSize()。width将返回最长行的宽度。

答案 1 :(得分:0)

对于那些可能会遇到同样问题(或只是好奇)的人。在此处找到了解决方案:link

这个想法非常简单:

public int getContentHeight(int width, String content) {
    JEditorPane dummyEditorPane = new JEditorPane();
    dummyEditorPane.setSize(width, Short.MAX_VALUE);
    dummyEditorPane.setText(content);
    return dummyEditorPane.getPreferredSize().height;
}