2016-12-20 66 views
0

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

作为测试,代码如下:

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

我写了一个类似的问题的详细解答。检查here

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

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

+0

谢谢。现在我可以正常使用StyledDoc和ect。 –

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