Fensterinhalt baut sich erst bei Größenveränderung auf

Status
Nicht offen für weitere Antworten.

Bwana

Mitglied
Guten abend zusammen,

nachdem ich in der Uni letztes semester die grundlagen für java kennengelernt hab, hab ich nun angefangen eigene klitzekleine programme zu basteln.
Meine Frage bezieht sich auf einen SleepTimer (der auch funktioniert => download)

(1)er besteht aus 2 fenstern, die haargenau aus dem gleichen code bestehen, das zweite fenster jedoch öffnet sich, zeigt aber keinen inhalt an! erst wenn man seine größe verändert (oder auch nur auf den Rahmen klickt ohne die Größe letztlich wirklich zu verändern) wird der Inhalt des Fensters eingeblendet.

(2)auch erscheinen beide fenster mittig vom screen (wie gewollt), für einen kurzen augenblick blinkt jedoch noch irgendwas anderes fenster-ähnliches am linken oberen bildrand auf.

Meine Frage nun, warum ist das so und wie kann ich es beheben.

hier mal mein code zu einem fenster, das andere ist analog:

Code:
JFrame timer = new TimerGui();	
		timer.setSize(169,110);
		timer.setResizable(false);
		timer.setVisible(true);
		timer.setLocationRelativeTo(null);
		timer.setAlwaysOnTop(true);
		timer.addWindowListener(listener);
Code:
public TimerGui()
	{
		setTitle("Timer-Eingabe");
		JPanel contentTimer = new JPanel();
		JLabel ueberschrift = new JLabel("Windows herunterfahren in: ");
		JLabel hoursLabel = new JLabel("HH");	
		JLabel minutesLabel = new JLabel("MM");
		
		contentTimer.add(ueberschrift);
		contentTimer.add(hours);
		contentTimer.add(hoursLabel);
		contentTimer.add(minutes);
		contentTimer.add(minutesLabel);
		contentTimer.add(ok);
		
		ok.addActionListener(this);
		
		setContentPane(contentTimer);		
	}

thx schon mal im voraus!
 
Das mit dem "Aufblinken" kann daran liegen, dass er die Fenster erst mal standardmäßig in der Linken oberen Ecke (0, 0) zeichnet und sie dann erst in die Mitte des Bildschirms setzt. Das könntest du beheben, indem du Die Fenster manuell per setBounds ind die Mitte des Bildschirms setzt:
Code:
int w = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int h = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
int sx = 169;
int sy = 110;
setBounds((w/2)-(sx/2), (h/2)-(sy/2), (w/2)+(sx/2), (h/2)+(sy/2));

Das mit dem späten Anzeigen der Komponenten kannst du glaube ich lösen, indem du hinter setVisible(true) die folgenden Zeilen einfügst:
Code:
timer.validate();
timer.repaint();
 
danke für die schnelle Hilfe !!

beides funktioniert nun 😀 ,
wobei ich die letzten beiden Parameter von setBounds() etwas verändert habe, da die Fenstergröße unabhängig von der screen-größe sein soll.

auch musste mir erst noch klar werden, dass repaint erst sinn macht, nachdem contentPane hinzugefügt wurde.

eine Frage hab ich aber noch...es funktioniert sowohl mit nur repaint() als auch mit nur validate();
aus der API entnehme ich, dass beide dazu da sind, im falle einer modifikation von komponenten, den inhalt upzudaten?!
wo liegt also der unterschied ??
 
Validate ordnet soweit ich weis das Layout etc. neu an (z.B. nachdem das Fenster in der Größe verändert wurde). Repaint zeichnet soweit ich weis nur den Inhalt des Frames neu (z.B. nachdem das Fenster minimiert und dann wieder maximiert wurde).
Ich hab mich damit noch nie so wirklich beschäftigt, habe aber gemerkt, dass man mit beiden nacheinander immer auf der sicheren Seite ist.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben