2016-12-20 86 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; 
}