Получите высоту многострочного текста с фиксированной шириной для правильного изменения размера диалога
Я хочу создать диалог, который содержит некоторый текстовый элемент (JLabel / JTextArea и т. Д.), Который состоит из нескольких строк и переносит слова. Я хочу, чтобы диалог был фиксированной ширины, но менял высоту в зависимости от размера текста. У меня есть этот код:
<code>import static javax.swing.GroupLayout.DEFAULT_SIZE; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class TextSizeProblem extends JFrame { public TextSizeProblem() { String dummyString = ""; for (int i = 0; i < 100; i++) { dummyString += " word" + i; //Create a long text } JLabel text = new JLabel(); text.setText("<html>" + dummyString + "</html>"); JButton packMeButton = new JButton("pack"); packMeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pack(); } }); GroupLayout layout = new GroupLayout(this.getContentPane()); getContentPane().setLayout(layout); layout.setVerticalGroup(layout.createParallelGroup() .addComponent(packMeButton) .addComponent(text) ); layout.setHorizontalGroup(layout.createSequentialGroup() .addComponent(packMeButton) .addComponent(text, DEFAULT_SIZE, 400, 400) //Lock the width to 400 ); pack(); } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new TextSizeProblem(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } </code>
При запуске программы это выглядит так: альтернативный текст http://lesc.se/stackoverflow/multiline_size_1.png
Но я бы хотел, чтобы диалоговое окно выглядело так (например, когда вы нажимаете кнопку пакета): альтернативный текст http://lesc.se/stackoverflow/multiline_size_2.png
Я предполагаю, что проблема заключается в том, что диспетчер компоновки не смог определить правильную высоту текста перед его отображением на экране. Я пробовал различные validate (), invalidate (), validateTree () и т. Д., Но не удалось.