2016-12-20 4 views
0

Основная идея состоит в том, чтобы нарисовать конкретную форму с использованием библиотеки Swing (она будет использоваться для создания изображения, которое будет перенесено на принтер escpos, но это другой вопрос). Сама форма имеет контейнер с полной шириной, который представляет собой метку. Метка имеет собственный шрифт, размер шрифта и может иметь линию, поэтому я использовал JTextPane. Элемент JTextPane и все формы будут иметь фиксированный размер 500 пикселей.Получение высоты содержимого 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

Идея заключается в том, что getPreferredSize(). Height, вызываемый на JTextPane, возвращает высоту, необходимую для отображения текущего содержимого с учетом текущей ширины. Если ширина еще не установлена, она вернет требуемую высоту, если ширина JTP равна ширине самой длинной линии.

С той же логикой ширина getPreferredSize() будет равна ширине самой длинной линии.

+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; 
} 
Смежные вопросы