Guten Abend,
Ich würde gerne wissen, wie die Größe einer JComponent zu erhalten, nachdem es mit einem LayoutManager angelegt wurde. Ich habe gelesen, dass dies möglich ist, wenn man einfach dolayout(), validate() oder setVisible() vorher aufruft. Allerdings kann ich es nicht bekommen, um in meinem Code zu arbeiten.
Der Grund, warum ich das wissen möchte, ist, dass ich nur so viele Komponenten hinzufügen möchte, wie in die eingestellte Größe des Rahmens passen, ohne die Größe der Komponenten vorher zu kennen. Der Aufruf von validate() legt die Größe der Komponenten in diesem Codebeispiel nicht fest. Irgendwelche Ideen, wie ich die richtige Größe ermitteln kann?
public class TestFrame extends JFrame {
public static void main(String args[]) {
TestFrame frame = new TestFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public TestFrame() {
super("Test Frame");
super.setSize(300, 600);
this.addComponents();
}
private void addComponents() {
int heightLeft = this.getHeight();
JPanel panel = new JPanel();
panel.setSize(300, 600);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
String text = "This is a long String that represents "
+ "the length of strings in my application. "
+ "This will vary in the real application."
+ "<ul><li>It uses html</li><li>not just</li>"
+ "<li>plain text</li></ul>"
+ "I'd like as many as will fit in the fame to be added.\n";
while (true) {
JTextPane textPane = createTextPane(text);
this.invalidate();
if (heightLeft > 0) {
panel.add(textPane);
} else {
break;
}
System.out.println("Before validation:" + textPane.getSize());
// returns width and height = 0
this.validate();
System.out.println("After validation:" + textPane.getSize());
// Still returns width and height = 0
heightLeft -= textPane.getPreferredSize().getHeight();
}
super.add(panel);
}
public JTextPane createTextPane(String text) {
JTextPane textPane = new JTextPane();
textPane = new JTextPane();
textPane.setEditorKit(new StyledEditorKit());
textPane.setEditable(false);
textPane.setOpaque(false);
textPane.setContentType("text/html");
textPane.setText(text);
return textPane;
}
}
Vielen Dank für Ihre Zeit!