Abrufen der Höhe von mehrzeiligem Text mit fester Breite, um die Größe des Dialogfelds korrekt anzupassen
Ich möchte ein Dialogfeld erstellen, das eine Art Textelement (JLabel / JTextArea usw.) enthält, das mehrzeilig ist, und die Wörter umschließen. Ich möchte, dass das Dialogfeld eine feste Breite hat, passe die Höhe jedoch an, je nachdem, wie groß der Text ist. Ich habe diesen Code:
<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>
Wenn Sie das Programm ausführen, sieht es so aus:Alternativtext http://lesc.se/stackoverflow/multiline_size_1.png
Aber ich möchte, dass der Dialog so aussieht (als ob Sie den Pack-Button drücken):Alternativtext http://lesc.se/stackoverflow/multiline_size_2.png
Ich vermute, dass das Problem darin besteht, dass der Layout-Manager die richtige Höhe des Texts nicht ermitteln konnte, bevor er auf dem Bildschirm angezeigt wurde. Ich habe verschiedene validate (), invalidate (), validateTree () usw. ausprobiert, aber es ist mir nicht gelungen.