# JFrame bleibt leer, keine Ahnung warum



## 1337iceskater (25. Jan 2010)

Hallo Leute,

ich will mir nen ProgressFenster machen, was den Fortschritt meines Tools anzeigen soll. Da ich das Fenster mehrmals mit unterschiedlichen Eigenschaften brauche, setze ich die Variable einfach vorher auf null. Dadurch kann ich sie dann wieder neu instanziieren. Leider bleibt das Fenster beim 2. Start einfach weiß, obwohl jede weiße Hintergrundfarbe normalerweise nicht sichtbar ist. Auch die Texte und die ProgressBar sind dann nicht mehr sichtbar. Daher denke ich, dass es in irgendeiner Weise am Konstruktor liegt.

Hier mal der Code der Klasse:

```
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

import logic.HelpClass;

public class JLadeBalken extends JFrame{

	private static final long serialVersionUID = 1L;
	private JProgressBar pb;
	private JLabel ta;
	private JPanel content;
	
	private void close(){
		System.out.println(this.getDefaultCloseOperation() == JFrame.DISPOSE_ON_CLOSE);
		HelpClass.inProgress = false; //Statusvariable
		HelpClass.repliAllow = false;  //Statusvariable
	}
	
	public JLadeBalken(boolean loggedIn){
		super("Replizierung läuft");
		if(loggedIn){
			this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		}
		else{
			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		}
		this.setIconImage(Toolkit.getDefaultToolkit().getImage("files\\pictures\\vb_small.png"));
		this.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2 - 100,
				(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/2 - 60);
		this.setSize(320, 340);
		this.setLayout(new BorderLayout());
		this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent event1) {
                close();
            }
        }); 
		JLabel l = new JLabel();
		l.setBounds(10, 20, this.getWidth(), this.getHeight()-50);
		l.setIcon(new ImageIcon("files\\pictures\\logo_ladevorgang.png"));
		l.setOpaque(false);
		
		content = new JPanel();
		content.setLayout(null);
//		content.setBackground(Color.WHITE);
		
		ta = new JLabel();
		pb = new JProgressBar();
		pb.setStringPainted(true);
		pb.setMaximum(100);
		pb.setMinimum(0);
		pb.setValue(0);
		
		ta.setBounds(30, this.getHeight()-80, this.getWidth()-50, 30);
		pb.setBounds(0, ta.getY()-50, this.getWidth()-17, 30);
		
		content.add(pb);
		content.add(ta);
		content.add(l);
		
		this.add(content, BorderLayout.CENTER);
		
		l.setVisible(true);
		pb.setVisible(true);
		this.setAlwaysOnTop(true);
		content.setVisible(true);
		this.setVisible(true);
	}
	
	public void setText(String text, int vorgang){
		vorgang--;
		if(!text.equals("Initialisierung")&&!text.equals("Stop")){
			text = "Repliziere "+text;
		}
		else if(text.equals("Stop")){
			this.setVisible(false);
			HelpClass.resetLB();  //statische Methode, folgt weiter unten 
			this.dispose();
		}
		if(!text.equals("Stop")){
			pb.setValue(100/13*vorgang);
			ta.setText("<html>"+text+"..."+"</html>");
			if(!this.isVisible()){
				this.setVisible(true);
			}
		}
		content.repaint();
	}
}
```

So, hier dann noch die Funktionen, die aufgerufen werden, bzw aufrufen:


```
//Funktion zum Setzen eines Statustextes und der Prozentanzeige        
public static void setState(String s, int i){
		if(lb == null){        //lb = LadeBalken in dieser Klasse
			lb = new JLadeBalken(loggedIn);
			inProgress = true;
			loggedIn = true;
		}
		lb.setText(s, i);
	}

        //Funktion, die beim Beenden der Fortschrittsanzeige aufgerufen wird
        public static void resetLB(){
		lb = null;
		repliAllow = true;
		inProgress = false;
	}
```

Das ist ein Ausschnitt des Aufrufes (davon gibt es mehrere):


```
if(HelpClass.repliAllow){
			HelpClass.setState("Spielpaarungen", 13);
			replicateTeamTournaments(db);     //eigentliche Replizierungsfunktion
		}
		Log.writeLog("Replizierung abgeschlossen");
		HelpClass.setState("Stop", -1);
		HelpClass.repliAllow = true;
```

Hinzukommt, dass auch die DefaultCloseAction nicht mehr funzt und auch der WindowListener erst nach Ende des Fensters beim 2. mal reagiert. Wie gesagt, beim ersten Start ist alles toll, der 2. hapert irgendwie.

Ich hoffe, ihr versteht wo mein Problem ist, anbei auch nochmal der Screenshot mit der Gegenüberstellung der richtigen und der falschen Darstellung.

Ich hoffe ihr könnt mir helfen =),

LG von mir


----------



## Foermchen82 (26. Jan 2010)

du referenzierst da noch auf ne HelpClass. Wär nicht schlecht, wenn du die auch noch posten könntest.


----------



## 1337iceskater (26. Jan 2010)

OK, 

hier dann mal die HelpClass. Das ist unsere einzige statische Klasse und die Variablen, die ich verwende sind an sich alle booleans.


```
private static JLadeBalken lb;
	private static boolean loggedIn = false;
	public static boolean repliAllow = true;
	public static boolean inProgress = false;
	
	public static void setState(String s, int i){
		if(lb == null){
			lb = new JLadeBalken(loggedIn);
			inProgress = true;
			loggedIn = true;
		}
		lb.setText(s, i);
	}
	
	public static void resetLB(){
		lb = null;
		repliAllow = true;
		inProgress = false;
	}
```

das ist der einzige Bereich, der verwendet wird =)
Ich hoffe, das hilft dir weiter.

LG Stefan


----------



## Foermchen82 (26. Jan 2010)

Da fehlt immer noch code. Poste doch mal alles, was benötigt wird um es nachzustellen. Sonst kann man dir nicht helfen. Z.b. fehlt die Mehtode "replicateTeamTournaments(db);"


----------



## 1337iceskater (26. Jan 2010)

Die replicateTeamTournament(db) braucht man nicht, um es nachzustellen. Es geht ja nicht um die Funktionalität sondern um die Erscheinung des LadeBalkens. So wie es jetzt ist, kann man ihn aufrufen.
Das wichtige ist die setState(String text, int i) und der Konstruktor.

(Das ganze Projekt hier zu posten wäre zu viel  )

LG STefan


----------



## Gast2 (26. Jan 2010)

1337iceskater hat gesagt.:


> Die replicateTeamTournament(db) braucht man nicht, um es nachzustellen. Es geht ja nicht um die Funktionalität sondern um die Erscheinung des LadeBalkens. So wie es jetzt ist, kann man ihn aufrufen.
> Das wichtige ist die setState(String text, int i) und der Konstruktor.
> 
> (Das ganze Projekt hier zu posten wäre zu viel  )
> ...



Dann mach einfach ein KSKB... Vor allem schau dir das Wort kurz an ...


----------



## 1337iceskater (26. Jan 2010)

Es geht^^
Handelte sich um n Thread-Problem. Am Anfang gibt es noch nur den einen Thread, danach gibt es aber scheinbar zu viele als das der SwingThread noch genug Zeit zum zeichnen bekommt. Habs jetzt einfach in nem neuen Thread laufen und siehe da: Es geht =)

Danke trotzdem für deine Hilfe.

LG Stefan

PS: was ist ein KSKB?


----------



## Gast2 (26. Jan 2010)

1337iceskater hat gesagt.:


> Es geht^^
> Handelte sich um n Thread-Problem. Am Anfang gibt es noch nur den einen Thread, danach gibt es aber scheinbar zu viele als das der SwingThread noch genug Zeit zum zeichnen bekommt. Habs jetzt einfach in nem neuen Thread laufen und siehe da: Es geht =)
> 
> Danke trotzdem für deine Hilfe.
> ...



Drüberfahren ToolTip anschauen...
Joa kannst dir auch mal die Klasse SwingWorker anschauen...


----------

