JFrame repaint/validate Probleme

Status
Nicht offen für weitere Antworten.
H

hephaistos

Gast
hallo again,

ich bin schon wesentlich weiter, als gestern :)

verwende nun doch JFrames...

ich habe nun ein Window, in welches ich Daten eingeben lasse, mittels "actionPerformed()" checke ich dann die eingegebenen Daten und rufe in dieser Methode weitere Methoden auf ("dispose" das Eingabefenster und lade ein neues). Da tritt ein Problem auf:

Ich gehe nämlich "repaint()e" nämlich das Fenster jeweils bei einem Schleifendurchlauf in gewissen Zeitabständen mit "Thread.sleep()". Das funktioniert aber da nicht korrekt, weil nur ein "graues/leeres" Window angezeigt wird.

Hat jemand eine Lösung? Fehlermeldung krieg ich leider keine....

thx!
 

Ebenius

Top Contributor
Läuft die Schleife im EventDispatcher-Thread (zum Beispiel direkt aus der actionPerformed()-Methode)?

Kannst Du mal ein bisschen Code posten (das wichtige - nicht alles)?

Es grüßt Ebenius
 
G

Guest

Gast
hallo!

nein, die schleife läuft nicht direkt in der actionPerformed-Methode.
es gibt eine eigene Methode dafür - diese wird in actionPerformed aufgerufen.

code post ich ungern, weil das mein erstes GUI-Geschreibsel ist, da kennt sich bestimmt keiner aus.
ABer wenn du mir so nicht helfen kannst, stell ich ihn natürlich "ungern" :) rein.

ciao
 

Ebenius

Top Contributor
Gut. Wenn die actionPerformed()-Methode die andere Methode aufruft, dann läuft es trotzdem im EventDispatcher-Thread.

Ein bisschen Code sollte hier wirklich helfen. Schneid's halt zusammen, so dass das wesentliche enthalten ist. Wenn Du wirklich sehr ungern Code postest, dann erklärs noch genauer... oder schick mir ne Mail...

Es grüßt Ebenius
 
G

Guest

Gast
ja, wie krieg ich das aus diesem "EventDispatcher-Thread" raus? bzw. was kann ich dagegen tun?

danke für deine antworten!
 

Ebenius

Top Contributor
Okay, ich glaube Du solltest hier doch mal beschreiben, was Du genau erreichen möchtest (Use-Case-Beschreibung)oder poste halt Source-Code.

Ich habe ja noch nichtmal gesagt, dass es aus dem EventDispatcher-Thread muss... Allerdings sind da
Code:
Thread.sleep(...);
-Aufrufe ungünstig!

Es grüßt Ebenius
 
G

Guest

Gast
ahaaa, das dachte ich mir ja.

kann ich das irgendwie umgehen? gibts ein "synonym" für Thread.sleep??? thxx!!!
 
G

Guest

Gast
okay, hier ist mein geheimer code :)
ich denke DU siehst gleich, was los ist :)

danke
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

public class CountDown extends WindowAdapter implements ActionListener {
	
	int iRunHours=0, iRunMinutes=0, iRunSeconds=0;

	int iLoops=5, iRange=-1, iLastSeconds=10;
	JFrame countDownWindow, inputWindow;
	JLabel lHours, lMinutes, lSeconds, errorMessage;
	Font fHours, fMinutes, fSeconds;
	DecimalFormat numberFormat;
	ImageIcon logoImage;
	Image topIcon;
	Button startCounter;
	JSpinner inputHours, inputMinutes, inputSeconds;
	String sOccouredErrors="";

	public CountDown() {
		this.numberFormat = new DecimalFormat("00");
	}

	public static void main(String[] args) {
		CountDown cCountDown = new CountDown();
		cCountDown.generateInputWindow();
	}

	public void actionPerformed(ActionEvent event) {

		this.iRunHours   = Integer.parseInt(inputHours.getValue().toString());
		this.iRunMinutes = Integer.parseInt(inputMinutes.getValue().toString());
		this.iRunSeconds = Integer.parseInt(inputSeconds.getValue().toString());
		this.errorMessage.setText("start CountDown...");
		this.startCounter.removeActionListener(this);
		this.inputWindow.removeWindowListener(this);
		this.inputWindow.dispose();

		this.generateCountDownWindow();
//hier beginnt das Problem!
		this.doCountDown();
	}
	
	private void setCountDown(int iRange) {
		this.iRunSeconds += iRange;
		if ( this.iRunSeconds<0 ) {
			this.iRunSeconds = 59;
			this.iRunMinutes--;
		}
		if ( this.iRunMinutes<0 ) {
			this.iRunMinutes = 59;
			this.iRunHours--;
		}
		if ( this.iRunHours<0 ) {
			this.iRunHours = 23;
		}
	}
	
	private void generateInputWindow() {
		this.inputWindow = new JFrame("[CountDown] © by hephaistos");

		try {
			UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
		} catch (Exception e) {
			this.sOccouredErrors += "\n"+e;
		}

		this.inputWindow.getContentPane().setLayout(new FlowLayout());

		this.topIcon = java.awt.Toolkit.getDefaultToolkit().getImage("copyright.gif");
		this.inputWindow.setIconImage(this.topIcon);

		JPanel inputPanel = new JPanel(); 
		inputPanel.setLayout(new GridLayout(4,2));
		inputPanel.add(new JLabel("Stunden: "));
		this.inputHours = new JSpinner(new SpinnerNumberModel(00,00,23,1));
		inputPanel.add(this.inputHours);
		inputPanel.add(new JLabel("Minuten: "));
		this.inputMinutes = new JSpinner(new SpinnerNumberModel(00,00,59,1));
		inputPanel.add(this.inputMinutes);
		inputPanel.add(new JLabel("Sekunden: "));
		this.inputSeconds = new JSpinner(new SpinnerNumberModel(00,00,59,1));
		inputPanel.add(this.inputSeconds);
		this.errorMessage = new JLabel("");
		inputPanel.add(this.errorMessage);
		this.startCounter = new Button("[CountDown starten]");
		this.startCounter.addActionListener(this);
		
		inputPanel.add(startCounter);
		this.inputWindow.getContentPane().add(inputPanel);
		
		this.inputWindow.addWindowListener(this);
		this.inputWindow.setVisible(true);
		this.inputWindow.pack();
		this.inputWindow.setLocation(((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width-this.inputWindow.getWidth())/2),((java.awt.Toolkit.getDefaultToolkit().getScreenSize().height-this.inputWindow.getHeight())/2));
		this.inputWindow.show();
	}
	
	private void generateCountDownWindow() {
		this.countDownWindow = new JFrame("[CountDown] © by hephaistos");

		try {
			UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
		} catch (Exception e) {
			this.sOccouredErrors += "\n"+e;
			System.out.println(this.sOccouredErrors);
		}

		this.countDownWindow.getContentPane().setLayout(new GridLayout(2,1));
		this.countDownWindow.getContentPane().setBackground(new Color(0,0,63));

		this.topIcon = java.awt.Toolkit.getDefaultToolkit().getImage("copyright.gif");
		this.countDownWindow.setIconImage(this.topIcon);

		this.logoImage = new ImageIcon(java.lang.ClassLoader.getSystemResource("logo.gif")); 
		JLabel jlabel = new JLabel(this.logoImage);  
		this.countDownWindow.getContentPane().add(jlabel); 
		
		this.lHours = new JLabel(formatTime(this.iRunHours), JLabel.CENTER);
		this.lHours.setForeground(new Color(255, 51, 0));
		this.lHours.setFont(new Font("Arial", Font.BOLD, 220));
	
		this.lMinutes = new JLabel(formatTime(this.iRunMinutes), JLabel.CENTER);
		this.lMinutes.setForeground(new Color(255, 51, 0));
		this.lMinutes.setFont(new Font("Arial", Font.BOLD, 230));
		
		this.lSeconds = new JLabel(formatTime(this.iRunSeconds), JLabel.CENTER);
		this.lSeconds.setForeground(new Color(255, 51, 0));
		this.lSeconds.setFont(new Font("Arial", Font.BOLD, 240));
		
		JPanel timePanel = new JPanel(); 
		timePanel.setLayout(new GridLayout(1,3));
		timePanel.setBackground(new Color(0,0,63));
		timePanel.add(this.lHours);
		timePanel.add(this.lMinutes);
		timePanel.add(this.lSeconds);
		this.countDownWindow.getContentPane().add(timePanel);
		
		this.countDownWindow.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
		this.countDownWindow.addWindowListener(this);
		this.countDownWindow.setVisible(true);
		this.countDownWindow.show();
		this.countDownWindow.validate();
	}	
	
	private void doCountDown() {
		this.setCountDown(-1);

		while ( !(this.iRunHours==0) || !(this.iRunMinutes==0) || !((this.iRunSeconds-this.iLastSeconds)<=1) ) {
			this.setCountDown(this.iRange);
			this.lHours.setText(formatTime(this.iRunHours));
			this.lMinutes.setText(formatTime(this.iRunMinutes));
			this.lSeconds.setText(formatTime(this.iRunSeconds));

			this.countDownWindow.repaint();
			this.sleepForMillis(1000);
		}
		//letzte X Sekunden
		for (int i=0; i<=this.iLastSeconds; i++) {
			this.setCountDown(this.iRange);

			this.lSeconds.setText(formatTime(this.iRunSeconds));
			this.fSeconds = this.lSeconds.getFont();
			this.lSeconds.setForeground(new Color(240, 248, 255));
			this.lSeconds.setFont(new Font(this.lSeconds.getName(), this.fSeconds.getStyle(), this.fSeconds.getSize()+20));

			this.sleepForMillis(500);

			this.lSeconds.setText(formatTime(this.iRunSeconds));
			this.fSeconds = this.lSeconds.getFont();
			this.lSeconds.setForeground(new Color(255, 51, 0));
			this.lSeconds.setFont(new Font(this.lSeconds.getName(), this.fSeconds.getStyle(), this.fSeconds.getSize()-20));
			this.countDownWindow.repaint();
			this.sleepForMillis(500);
		}
		//Blinken lassen
		for (int i=0; i<40; i++) {
			if ( i%2==0 ) {
				this.fHours = this.lHours.getFont();
				this.lHours.setForeground(new Color(255, 51, 0));
				this.lHours.setFont(new Font(this.lHours.getName(), this.fHours.getStyle(), this.fHours.getSize() +10));
				this.fMinutes = this.lMinutes.getFont();
				this.lMinutes.setForeground(new Color(255, 51, 0));
				this.lMinutes.setFont(new Font(this.lMinutes.getName(), this.fMinutes.getStyle(), this.fMinutes.getSize() +20));
				this.fSeconds = this.lMinutes.getFont();
				this.lSeconds.setForeground(new Color(255, 51, 0));
				this.lSeconds.setFont(new Font(this.lSeconds.getName(), this.fSeconds.getStyle(), this.fSeconds.getSize() +10));
			} else {
				this.fHours = this.lHours.getFont();
				this.lHours.setForeground(new Color(0, 255, 255));
				this.lHours.setFont(new Font(this.lHours.getName(), this.fHours.getStyle(), this.fHours.getSize() -10));
				this.fMinutes = this.lMinutes.getFont();
				this.lMinutes.setForeground(new Color(0, 255, 255));
				this.lMinutes.setFont(new Font(this.lMinutes.getName(), this.fMinutes.getStyle(), this.fMinutes.getSize() -20));
				this.fSeconds = this.lMinutes.getFont();
				this.lSeconds.setForeground(new Color(0, 255, 255));
				this.lSeconds.setFont(new Font(this.lSeconds.getName(), this.fSeconds.getStyle(), this.fSeconds.getSize() -10));
			}
			this.countDownWindow.repaint();
			this.sleepForMillis(50);
		}
	}
	
	private String formatTime(int iTime) {
		return this.numberFormat.format(iTime);
	}
	
	private void sleepForMillis(int iWaitFor) {
		try {
			Thread.sleep(iWaitFor);
		} catch (InterruptedException e) {
			//nothing
		}
	}
	
	public void windowClosing(WindowEvent event){
		if ( this.countDownWindow != null ) {
			this.countDownWindow.dispose();
		}
		if ( this.inputWindow != null ) {
			this.inputWindow.dispose();
		}
		System.exit(0);
	} 
}
 

Ebenius

Top Contributor
Gast hat gesagt.:
ich denke DU siehst gleich, was los ist
Auch wenn Du jetzt lachst: Ich habe gleich gesehen was los ist. Deine doCountDown()-Methode läuft direkt im EventDispatcher-Thread. Dieser Thread wird auch zum Zeichnen benötigt. Daher kannst Du ihn nicht einfach blockieren und repaint() aufrufen, da Du damit quasi das komplette UI totlegst.

:idea: Vorschlag (Pseudo-Code):
Code:
public void actionPerformed(...)
{
    disableAllInteractingComponents();
    startTimer();
}
... und den Timer initialisierst Du dann so, dass er nach Ablauf der Zeit alles wieder enabled. Schau Dir einfach mal java.util.Timer und javax.swing.Timer an. Einer der beiden wird dir dann schon helfen.

:!: Dadurch wird Dein Code auch erheblich kürzer und Du postest ihn weniger ungern 8)

Es grüßt Ebenius
 
G

Guest

Gast
Frage:
so "Button-Klicks" kann man eh NUR mit actionPerformed aufrufen oder?
weil aus dem Timer werd ich nicht wirklich schlau.

Wie könnte ich denn das machen?

thx
 

Ebenius

Top Contributor
Dann lies Dir mal meinen letzten Link genau Durch. In diesem Beitrag ist auch nochmal auf eine Seite von Sun verlinkt, wie man mit Threads & Swing umgeht.

Viel Spaß.
Es grüßt Ebenius
 
H

hephaistos

Gast
hallo,

hab doch noch einiges suchen müssen, aber jetzt hauts hin :)

habs mit new Thread gemacht - aber bis dahin wars ein langer weg.

danke für deine hilfe!
 

Ebenius

Top Contributor
Wenn man ein bisschen dafür arbeitet ist der Erfolg doch um so schöner. Ist aber okay, die Party fing eh erst spät an; ich hatte Zeit. :)

Es grüßt Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JFrame und repaint()/validate() AWT, Swing, JavaFX & SWT 2
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
Q Frage zu Repaint bei JFrame AWT, Swing, JavaFX & SWT 3
R Neuzeichnen eines JFrame mit repaint AWT, Swing, JavaFX & SWT 3
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
Paty JFrame anfänger bräuchte hilfestellung AWT, Swing, JavaFX & SWT 7
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
Mausposition relativ zu JFrame bekommen AWT, Swing, JavaFX & SWT 6
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
N CPU Belastung bei offenem JFrame auf fast 100% AWT, Swing, JavaFX & SWT 15
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
E JFrame resizing AWT, Swing, JavaFX & SWT 2
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Tabelle in JFrame einfügen AWT, Swing, JavaFX & SWT 1
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Swing Design des oberen Balkens in JFrame AWT, Swing, JavaFX & SWT 2
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
K JFrame bei JUnit Tests AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
R Swing JPanels auf JFrame auf verfügbaren Platz aufblasen AWT, Swing, JavaFX & SWT 4
JR2205 Swing JxMaps Einbindung Netbeans JFrame AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
Ghostman1711 JFrame closing AWT, Swing, JavaFX & SWT 3
R Engineklasse mit JFrame AWT, Swing, JavaFX & SWT 4
M Default-WindowListener JFrame entfernen (Stichwort: iconified) AWT, Swing, JavaFX & SWT 4
ms_cikar Jframe zurück zu frame1 AWT, Swing, JavaFX & SWT 14
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
R JFrame schließen AWT, Swing, JavaFX & SWT 9
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
I JFrame an Bildschirm anpassen AWT, Swing, JavaFX & SWT 1
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
P JFrame schrumpft bei Doppelklick auf die Titelleiste AWT, Swing, JavaFX & SWT 0
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
D JFrame mindestgröße erzwingen AWT, Swing, JavaFX & SWT 2
H Swing JFrame mit JFXPanel NPE bei dispose() AWT, Swing, JavaFX & SWT 6
C Swing Borderlayout im JFrame AWT, Swing, JavaFX & SWT 4
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
G Swing JFrame öffnen bei Pidgin Benachrichtigung AWT, Swing, JavaFX & SWT 5
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
G Resize JFrame AWT, Swing, JavaFX & SWT 8
J Teiltransparenter JFrame mit Blur-Effekt AWT, Swing, JavaFX & SWT 2
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
K SplashScreen neben JFrame behalten AWT, Swing, JavaFX & SWT 10
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
T Applet Applet in JFrame einbinden AWT, Swing, JavaFX & SWT 8
V JFrame wird nicht richtig angezeigt! AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben