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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage