ich habe das problem, dass setPreferredSize() (teilweise) ignoriert wird:
das panel hat nach ausführen der methode die größe (100,250). ich gehe davon aus, dass "mein" thread schneller ist und die size (250,100) überschreibt, bevor der layoutmanager das layout berechnet. (um das zu testen lasse ich den thread schlafen, was die theorie bestätigt)
nungut: auf jeden fall bewirkt keine der validate/repaint zeilen, dass das panel neu gezeichnet wird.
die letzte (hier auskommentierte) zeile hat aber das gewünschte resultat. aber ist das wirklich der einfachste weg? (also muss ich wirklich an den layoutmanager des übergeordneten containers ran?)
setSize() funktioniert übrigens sofort, auch ohne irgendein repaint() oder validate() (allerdings will ich nicht die size ändern, sondern nur die preferred size).
hab ich nen denkfehler drin oder ist dies wirklich so umständlich, wenn man setPreferredSize() verwendet?
Code:
private void test() {
JFrame frame = new JFrame("Hallo Welt");
frame.setSize(800,800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
JPanel contentPane = new JPanel(new FlowLayout());
frame.setContentPane(contentPane);
JPanel panel = new JPanel();
panel.setBackground(Color.BLACK);
panel.setPreferredSize(new Dimension(250,100));
contentPane.add(panel);
panel.setLocation(100,100);
panel.setPreferredSize(new Dimension(100,250));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(contentPane.getLayout().preferredLayoutSize(contentPane));
panel.setPreferredSize(new Dimension(100,100));
System.out.println(contentPane.getLayout().preferredLayoutSize(contentPane));
// keine dieser 6 zeilen zeichnet das panel neu
panel.validate();
panel.repaint();
contentPane.validate();
contentPane.repaint();
frame.validate();
frame.repaint();
// zeichnet das panel neu
// contentPane.getLayout().layoutContainer(contentPane);
}
das panel hat nach ausführen der methode die größe (100,250). ich gehe davon aus, dass "mein" thread schneller ist und die size (250,100) überschreibt, bevor der layoutmanager das layout berechnet. (um das zu testen lasse ich den thread schlafen, was die theorie bestätigt)
nungut: auf jeden fall bewirkt keine der validate/repaint zeilen, dass das panel neu gezeichnet wird.
die letzte (hier auskommentierte) zeile hat aber das gewünschte resultat. aber ist das wirklich der einfachste weg? (also muss ich wirklich an den layoutmanager des übergeordneten containers ran?)
setSize() funktioniert übrigens sofort, auch ohne irgendein repaint() oder validate() (allerdings will ich nicht die size ändern, sondern nur die preferred size).
hab ich nen denkfehler drin oder ist dies wirklich so umständlich, wenn man setPreferredSize() verwendet?