# JDialog "Bitte warten..." durchsichtig



## richardkrieger (16. Mrz 2009)

Hallo,
im Programm werden Daten importiert. Währed des Imports soll ein JDialog mit "Bitte warten..." JLabel erscheinen. Erschienen ist garnix, bis ich die Decoration aktiviert habe. Habe hier im Forum Leite mit dem gleichen Problem gefunden und die Lösungen bei mir versucht-dasselbe. Habe im FAQ den Artikel "ProgressBars, Algorithmen und Multithreading" durchgeschaut und auch probiert die Sachen umzusetzen-auch nix. Habe beide Varianten versucht- Threads, SwingUtilities und SwingWorker. Bin am Ende meiner Weissheiten 
Mein JDialog:

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Dialog.ModalityType;

import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class FensterWarten extends SwingWorker<Boolean,String>{
	
	private JDialog dfenster=new JDialog();
	private String text="Bitte warten...";
	private JLabel tlabel=new JLabel();
	
	public FensterWarten(String utext){
		text=utext;
	}
	
	public void setText(String utext){
		tlabel.setText(utext);
	}
	
	public void stop(){
		dfenster.dispose();
	}

	@Override
	protected Boolean doInBackground() throws Exception {
		JPanel panel=new JPanel(new BorderLayout());
		panel.setBorder(BorderFactory.createEtchedBorder());
		dfenster.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		dfenster.setModalityType(ModalityType.MODELESS);
		dfenster.setAlwaysOnTop(true);
		dfenster.setUndecorated(false);
		dfenster.setLayout(new BorderLayout());
		tlabel.setText(text);
		panel.add(tlabel,BorderLayout.CENTER);
		dfenster.add(panel,BorderLayout.CENTER);
		dfenster.pack();
		Dimension mdim=Toolkit.getDefaultToolkit().getScreenSize();
		Dimension fdim=dfenster.getSize();
		int nh=(int)((mdim.getHeight()/2)-(fdim.getHeight()/2));
		int nb=(int)((mdim.getWidth()/2)-(fdim.getWidth()/2));
		dfenster.setLocation(100,100);
		dfenster.setVisible(true);
		return true;
	}
}
```

Aufrufende Methode einer anderen Klasse:

```
private void popFenster(){
		wfenster=new FensterWarten("Bitte warten...");
		wfenster.execute();
	}
```
Was mache ich falsch?


----------



## MiDniGG (16. Mrz 2009)

Also wenn ich Deinen Quelltext ausführe geht alles ohne Probleme. Hab halt das doInBackground() ma im Konstruktor von FensterWarten aufgerufen. Da gehts...

Also egal ob Decorated true oder false...


----------



## richardkrieger (16. Mrz 2009)

ok, dann die komplette aufrufende Klasse. Das Problem ist, dass Swing es nicht schafft, dass Fenster zu zeichnen:

```
import java.util.Observable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JOptionPane;

public class ImportStamm extends Observable{
	
	private DateiHaendler datei=new DateiHaendler();
	private MySQLHaendler sql=new MySQLHaendler();
	private String kursID=null;
	private FensterWarten wfenster=null;
	
	public void starten(){
		String warnung="<html>Folgende Daten werden im Laufe des Imports gelöscht:<br>";
		warnung+="<ul><li>ALLE Teilnehmer</li>";
		warnung+="<li>ALLE Kurse</li>";
		warnung+="<li>ALLE Ausleihen an Kurse</li>";
		warnung+="<li>ALLE Ausleihen an Teilnehmer</li></ul>";
		warnung+="Es wird dringend eine Sicherung oder Ausdruck der ";
		warnung+="Übersichtstabelle empfohlen!<p>Mit dem Import fortfahren?</p></html>";
		if(JOptionPane.showConfirmDialog(null, warnung, "Warnung!", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){
			Vector<String> dateiroh=datei.dateiLesenInVector("importstamm");
			if(dateiroh.size()>0){
				// pop start
				this.popFenster();
				// pop ende
				sql.tabLeeren("person");
				sql.tabLeeren("kurse");
				sql.tabLeeren("geliehen");
				sql.tabLeeren("personbuch");
				sql.tabLeeren("personkurs");
				sql.tabLeeren("uebersicht");
				Vector<String> ohneleer=this.leerweg(dateiroh);
				Vector<String> ohneUeber=this.ueberweg(ohneleer);
				Vector<String> fertig=this.seitenweg(ohneUeber);
				this.kursOtn(fertig);
			}
			this.setChanged();
			this.notifyObservers("aktualisieren");
			System.out.println("fertig");
			//wfenster.stop();
		}
	}
	
	
	private void kursOtn(Vector<String> uroh){
		for(int i=0;i<uroh.size();i++){
			StringTokenizer tokens=new StringTokenizer(uroh.get(i));
			if(tokens.hasMoreElements()){
				try{
					String tks=tokens.nextToken();
					Integer.parseInt(tks);
					this.tnAdd(uroh.get(i));
					continue;
				}catch(NumberFormatException e){
					this.kursAdd(uroh.get(i));
				}
			}
		}
	}
	
	private void kursAdd(String ut){
		String blang=ut.substring(5, 38).trim();
		String lehrer=ut.substring(38, 71).trim();
		String bkurz=ut.substring(76).trim();
		String bez=blang+"("+bkurz+")";
		String sqls="SELECT * FROM kurse WHERE lehrer='"+lehrer+"' AND kursname='"+bez+"'";
		Vector<String[]> res=sql.getDaten(sqls, new String[]{"id"});
		if(res.size()>0){
			this.kursID=res.get(0)[0];
		}else{
			String sqls1="INSERT INTO kurse(lehrer,kursname) VALUES('"+lehrer+"','"+bez+"')";
			sql.updateSatz(sqls1);
			res=sql.getDaten(sqls, new String[]{"id"});
			this.kursID=res.get(0)[0];
		}
	}
	
	private void tnAdd(String ut){
		StringTokenizer tokens=new StringTokenizer(ut);
		String[] tarr=new String[tokens.countTokens()];
		int tnid=0;
		int index=0;
		String sqls=null;
		while(tokens.hasMoreElements()){
			tarr[index]=tokens.nextToken();
			index++;
		}
		sqls="SELECT * FROM person WHERE vorname='"+tarr[2]+"' AND nachname='"+tarr[1]+"'";
		Vector<String[]> res =sql.getDaten(sqls, new String[]{"id"});
		if(res.size()>0){
			tnid=Integer.parseInt(res.get(0)[0]);
		}else{
			String sqls1="INSERT INTO person(vorname,nachname) VALUES('"+tarr[2]+"','"+tarr[1]+"')";
			sql.updateSatz(sqls1);
			res=sql.getDaten(sqls, new String[]{"id"});
			tnid=Integer.parseInt(res.get(0)[0]);
		}
		this.kursZuordnen(tnid);
	}
	
	private void kursZuordnen(int utn){
		String sqls="SELECT * FROM personkurs WHERE person='"+utn+"' AND kurs='"+this.kursID+"'";
		Vector<String[]> res=sql.getDaten(sqls, new String[]{"id"});
		if(res.size()<1){
			String sqls1="INSERT INTO personkurs(person,kurs) VALUES('"+utn+"','"+kursID+"')";
			sql.updateSatz(sqls1);
		}
	}
	
	private Vector<String> leerweg(Vector<String> uroh){
		Vector<String> rgwert=new Vector<String>();
		for(int i=0;i<uroh.size();i++){
			if(uroh.get(i).trim().length()>0){
				rgwert.add(uroh.get(i));
			}
		}
		return rgwert;
	}

	private Vector<String> seitenweg(Vector<String> uroh){
		Vector<String> rgwert=new Vector<String>();
		for(int i=0;i<uroh.size();i++){
			String[] teile=uroh.get(i).split("-");
			try{
				Integer.parseInt(teile[1].trim());
			}catch(Exception e){
				rgwert.add(uroh.get(i));
			}
		}
		return rgwert;
	}

	
	private Vector<String> ueberweg(Vector<String> uroh){
		Vector<String> rgwert=new Vector<String>();
		String[] ueber=new String[4];
		ueber[0]="HCA-Gymnasium";
		ueber[1]="Ausbildungsabschnitt";
		ueber[2]="Sortier-Nr.:";
		ueber[3]="-----------------------------------";
		for(int i=0;i<uroh.size();i++){
			boolean weg=false;
			for(int j=0;j<ueber.length;j++){
				if(uroh.get(i).indexOf(ueber[j])>0&&weg==false){
					weg=true;
				}
				}
				if(!weg){
					rgwert.add(uroh.get(i));
			}
		}
		return rgwert;
	}

	private void popFenster(){
		wfenster=new FensterWarten("Bitte warten...");
		wfenster.execute();
	}
}
```
Nach dem Aufruf "this.popFenster();" werden einige MySQL-Operationen ausgeführt. Die nehmen warscheinlich die Rechenzeit weg. Hier im Forum ist das Problem und die Lösungen bekannt, die habe ich ausprobiert-geht nicht.
Anscheinend habe ich was übersehen.


----------



## Beni (16. Mrz 2009)

"doInBackground": diese Methode wird im Hintergrund ausgefuehrt, genau hier soll das GUI-Zeugs *nicht* rein. In "doInBackground" soll der Teil des Codes rein, der so lange benoetigt, dass ein "Bitte waren" Dialog notwendig ist.

Du fuehrst all deinen Code im EDT aus, da wird der EDT natuerlich blockiert und kann nichts zeichnen.


----------



## richardkrieger (17. Mrz 2009)

OK, ich habe es probiert. jetzt sind Import-Methoden in einer privaten Klasse untergebracht, die "extendet SwingWorker" ist. JDialog liegt nach wie vor in der externen Klasse. Keine besserung beim JDialog, leider :-(

```
import java.util.Observable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.SwingWorker;

public class ImportStamm extends Observable{
	
	private DateiHaendler datei=new DateiHaendler();
	private MySQLHaendler sql=new MySQLHaendler();
	private FensterWarten wfenster=null;
	
	public void starten(){
		String warnung="<html>Folgende Daten werden im Laufe des Imports gelöscht:<br>";
		warnung+="<ul><li>ALLE Teilnehmer</li>";
		warnung+="<li>ALLE Kurse</li>";
		warnung+="<li>ALLE Ausleihen an Kurse</li>";
		warnung+="<li>ALLE Ausleihen an Teilnehmer</li></ul>";
		warnung+="Es wird dringend eine Sicherung oder Ausdruck der ";
		warnung+="Übersichtstabelle empfohlen!<p>Mit dem Import fortfahren?</p></html>";
		if(JOptionPane.showConfirmDialog(null, warnung, "Warnung!", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){
			Vector<String> dateiroh=datei.dateiLesenInVector("importstamm");
			if(dateiroh.size()>0){
				wfenster=new FensterWarten("Bitte warten...");
				ImportOP impop=new ImportOP(dateiroh);
				impop.execute();
				this.setChanged();
				this.notifyObservers("aktualisieren");
				System.out.println("fertig");
				wfenster.stop();
			}
		}
	}
	
	
	private class ImportOP extends SwingWorker<Boolean,Vector<String>>{
		
		Vector<String> dateiroh;
		String kursID=null;
		
		public ImportOP(Vector<String> ud){
			dateiroh=ud;
		}

		@Override
		protected Boolean doInBackground() throws Exception {
			sql.tabLeeren("person");
			sql.tabLeeren("kurse");
			sql.tabLeeren("geliehen");
			sql.tabLeeren("personbuch");
			sql.tabLeeren("personkurs");
			sql.tabLeeren("uebersicht");
			Vector<String> ohneleer=this.leerweg(dateiroh);
			Vector<String> ohneUeber=this.ueberweg(ohneleer);
			Vector<String> fertig=this.seitenweg(ohneUeber);
			this.kursOtn(fertig);
			return true;
		}
		
		private Vector<String> leerweg(Vector<String> uroh){
			Vector<String> rgwert=new Vector<String>();
			for(int i=0;i<uroh.size();i++){
				if(uroh.get(i).trim().length()>0){
					rgwert.add(uroh.get(i));
				}
			}
			return rgwert;
		}
		
		private Vector<String> seitenweg(Vector<String> uroh){
			Vector<String> rgwert=new Vector<String>();
			for(int i=0;i<uroh.size();i++){
				String[] teile=uroh.get(i).split("-");
				try{
					Integer.parseInt(teile[1].trim());
				}catch(Exception e){
					rgwert.add(uroh.get(i));
				}
			}
			return rgwert;
		}

		private void tnAdd(String ut){
			StringTokenizer tokens=new StringTokenizer(ut);
			String[] tarr=new String[tokens.countTokens()];
			int tnid=0;
			int index=0;
			String sqls=null;
			while(tokens.hasMoreElements()){
				tarr[index]=tokens.nextToken();
				index++;
			}
			sqls="SELECT * FROM person WHERE vorname='"+tarr[2]+"' AND nachname='"+tarr[1]+"'";
			Vector<String[]> res =sql.getDaten(sqls, new String[]{"id"});
			if(res.size()>0){
				tnid=Integer.parseInt(res.get(0)[0]);
			}else{
				String sqls1="INSERT INTO person(vorname,nachname) VALUES('"+tarr[2]+"','"+tarr[1]+"')";
				sql.updateSatz(sqls1);
				res=sql.getDaten(sqls, new String[]{"id"});
				tnid=Integer.parseInt(res.get(0)[0]);
			}
			this.kursZuordnen(tnid);
		}

		private void kursZuordnen(int utn){
			String sqls="SELECT * FROM personkurs WHERE person='"+utn+"' AND kurs='"+kursID+"'";
			Vector<String[]> res=sql.getDaten(sqls, new String[]{"id"});
			if(res.size()<1){
				String sqls1="INSERT INTO personkurs(person,kurs) VALUES('"+utn+"','"+kursID+"')";
				sql.updateSatz(sqls1);
			}
		}

		private void kursOtn(Vector<String> uroh){
			for(int i=0;i<uroh.size();i++){
				StringTokenizer tokens=new StringTokenizer(uroh.get(i));
				if(tokens.hasMoreElements()){
					try{
						String tks=tokens.nextToken();
						Integer.parseInt(tks);
						this.tnAdd(uroh.get(i));
						continue;
					}catch(NumberFormatException e){
						this.kursAdd(uroh.get(i));
					}
				}
			}
		}

		private void kursAdd(String ut){
			String blang=ut.substring(5, 38).trim();
			String lehrer=ut.substring(38, 71).trim();
			String bkurz=ut.substring(76).trim();
			String bez=blang+"("+bkurz+")";
			String sqls="SELECT * FROM kurse WHERE lehrer='"+lehrer+"' AND kursname='"+bez+"'";
			Vector<String[]> res=sql.getDaten(sqls, new String[]{"id"});
			if(res.size()>0){
				kursID=res.get(0)[0];
			}else{
				String sqls1="INSERT INTO kurse(lehrer,kursname) VALUES('"+lehrer+"','"+bez+"')";
				sql.updateSatz(sqls1);
				res=sql.getDaten(sqls, new String[]{"id"});
				kursID=res.get(0)[0];
			}
		}

		private Vector<String> ueberweg(Vector<String> uroh){
			Vector<String> rgwert=new Vector<String>();
			String[] ueber=new String[4];
			ueber[0]="HCA-Gymnasium";
			ueber[1]="Ausbildungsabschnitt";
			ueber[2]="Sortier-Nr.:";
			ueber[3]="-----------------------------------";
			for(int i=0;i<uroh.size();i++){
				boolean weg=false;
				for(int j=0;j<ueber.length;j++){
					if(uroh.get(i).indexOf(ueber[j])>0&&weg==false){
						weg=true;
					}
					}
					if(!weg){
						rgwert.add(uroh.get(i));
				}
			}
			return rgwert;
		}


		
	}
}
```
JDialog ist so lange da, bis import abgeschlossen ist, das ist in Ordnung. JDialog ist aber durchsichtig und ohne irgendwelche Inhalte.


----------



## Wildcard (17. Mrz 2009)

Du blockierst mit deiner Long Running Operation noch immer den UI Thread.
Wie viele Swing Threading Issues kommen diese Woche eigentlich noch? :autsch:


----------

