Holen Sie sich die Höhe von mehrzeiligen text mit fester Breite zu machen Dialogfeld Größe ändern, richtig
Erstellen Sie ein Dialogfeld, das enthält eine Art von text-element (JLabel/JTextArea etc), das ist mehrfach gefüttert und wickeln Sie die Worte. Ich will den dialog zu einer festen Breite, aber die Höhe anpassen, je nachdem, wie groß der text ist. Ich habe diesen 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);
}
});
}
}
Wenn das Programm läuft sieht das so aus:
(Quelle: lesc.se)
Aber ich möchte, dass der dialog wie folgt Aussehen (wie wenn Sie drücken Sie die pack-button):
(Quelle: lesc.se)
Ich vermute, dass das problem ist, dass der layout-manager war nicht in der Lage, um zu bestimmen, die richtige Höhe des Textes vor dem anzeigen auf dem Bildschirm. Ich habe verschiedene validate(), invalidate(), validateTree() etc aber nicht gelingen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Anpassung des Codes, zu tun, was Sie wollen.
Aber es braucht einen kleinen trick berechnen Sie die Größe der Beschriftung und legen Sie Ihre bevorzugte Größe.
Ich habe hier die Lösung gefunden
Ich denke, das ist, was Sie wollen:
Diese beschränken die JLabel zu 200 Pixel breit und passen sich automatisch der Höhe an, passen den text an.
Fand ich eine Lösung für mein problem. Durch den Austausch der JLabel mit einem JTextArea:
Und der Aufruf von pack() gefolgt von einem Aufruf der layout-manager der layout-Komponenten wieder, gefolgt von einem anderen pack:
Dadurch wird der layout-manager zum anpassen der Breite.
Den kompletten code:
(Sie können hinzufügen, einige Anpassungen (Rahmen, Farbe etc) also es sieht genauso aus wie das JLabel, aber ich habe ausgelassen, dass)