Java ProgressBar Problem

markuscjb

Grünschnabel
Hallo zusammen,

nun ich habe ein kleines Programm geschrieben mit dem ich Daten aus Acces ziehe und in eine MySQL DB schiebe. Das Programm funktioniert soweit. Nur der ProgressBar noch nicht. Das heißt er wird erst zum Schluss aktualisiert. Ich habe auch schon das Problem in mehreren Foren gefunden. Es liegt daran das Swing nicht nachkommt. Die Lösung sollte sein, dass dann die Progressbar in einem Thread aktualisiert werden sollte.
Nun ich muss zugeben ich bin Anfänger. Ich behersche die Grundlagen. Nur mit Threads haben wir in der Schule nie was gemacht. Ich habe daher mal eine Lösung versucht zu entwickeln. Nur es klappt nicht. Hier mal ein Ausschnitt aus meinem Code:

PHP:
public class ThreadKlasse extends Thread {

		  public void run(Integer aktueller_prozentsatz) {

		    while(!isInterrupted()) {
		    
		    JPuploadbar.setValue(aktueller_prozentsatz);
		    frame.repaint();	
		    	
		    }

		     }
		     

		  }
		
	class Auswahl extends MouseAdapter 
	{



	
			  			 
			  			ThreadKlasse progress_thread=new ThreadKlasse();
			  			progress_thread.start();
			  			
			  			
			  			//Access Ergebnismenge in der Schleife abarbeiten und Insert auf MySQL machen	
				  		while (rs.next()) {
				  			//Berechnen des Prozentwertes für Progressbar
				  			Prozent = (int)((100 * progress_status) / clmCnt);
				  			progress_thread.run(Prozent);

				  						  				
				  			
				  			JPuploadbar.setStringPainted(true);
				  			
				  			//Spalten namen Abfragen und ein Insert zusammen basteln.
					  		for(Integer x=1;x<=clmCnt-1;x++)
					  		{
					  			sql_update=sql_update+rsmd.getColumnLabel(x)+", ";
					  		
					  		
					  		}
					  		sql_update=sql_update+rsmd.getColumnLabel(clmCnt);
					  		sql_update=sql_update+") VALUES (";
					  		
					  		//Werte für den Insertstring zusammenbasteln
					  		for(Integer y=1;y<=clmCnt-1;y++)
					  		{
					  			sql_update=sql_update+"'"+rs.getString(y)+"',";
					  		
					  		
					  		}
					  		sql_update=sql_update+"'"+rs.getString(clmCnt)+"'";
					  		sql_update=sql_update+");";
					  	
					  	//Insert auf MYSQL durchführen
					  	//sql_update=sql_update+rsmd.getColumnLabel(x)+"="+rs.getString(x)+",";
				  		//System.out.println(sql_update);
				  		mysql_stmt.executeUpdate(sql_update);
				  		
				  		//Zurücksetzen des SQL Insertstrings
					  	sql_update="INSERT INTO Ergebnisse (";
					  	
					  	//Progress Status um eins inkrementieren
					  	progress_status++;
					  		
				  		}
				  		
				  		//Progress Updater beenden
				  		progress_thread.interrupt();
So das ist ein Ausschnitt aus meinem Programm. Also ich habe einen Thread vor dem Eintritt in die while Schleife erzeugt. Mit progress_thread.run(Prozent);
übergebe ich in der Schleife den Satz der die Progressbar aktualisieren soll. Und in der Klasse Thread sollte eigentlich die Progressbar aktualisiert werden. Nur es nicht.
Was mache ich falsch?

Danke schon mal für eure Anworten

Gruß
Markus
 
Zuletzt bearbeitet:
Hi,

versuchs mal so:

Java:
public class ThreadKlasse extends Thread {
    Auswahl objAuswahl;

    public ThreadKlasse(Auswahl _objAus){

        this.objAuswahl = _objAus;

    }

    public void run() {

        while(!isInterrupted()) {
		    
            JPuploadbar.setValue(this.objAuswahl.getProzent);
	    frame.repaint();	
		    	
        }
    }
}
		
class Auswahl extends MouseAdapter {

...
    int iProzent = 0;
    ThreadKlasse progress_thread=new ThreadKlasse(this);
    progress_thread.start();
			  			
    //Access Ergebnismenge in der Schleife abarbeiten und Insert auf MySQL machen	
    while (rs.next()) {
    //Berechnen des Prozentwertes für Progressbar
         this.iProzent = (int)((100 * progress_status) / clmCnt);
        JPuploadbar.setStringPainted(true);
...

    public int getProzent(){
        return(this.iProzent);
    }
 
Zuletzt bearbeitet:
Hi,

ne des klappt nicht. Weil wenn ich die Methode getProzent schreibe meckert Eclipse. Glaube es liegt daran das ich nicht eine Methode mit Rückgabewert in eine Methode schreiben darf die keine Rückgabewert hat. Ich weiß nicht könnt ihr damit was anfangen hab einen Link gefunden nur verstehe ich das nicht so ganz.
Wer-Weiss-Was

Java:
	 class ThreadKlasse extends Thread {
			Auswahl objAuswahl;

			 ThreadKlasse (Auswahl _objAus)
			{
				this.objAuswahl=_objAus;
				
			}
			
			  public void run() {

			    while(!isInterrupted()) {
			    
			    JPuploadbar.setValue(this.objAuswahl.getProzent());
			    frame.repaint();	
			    	
			    }

			     }
			     

			  }	
		
	class Auswahl extends MouseAdapter
	{

	


	public void mouseClicked(MouseEvent e)
		{
			super.mouseClicked(e);
			
		
			if (e.getSource()==JBAccessSelect) 
			{
				File filVari;
				
				try
				{
					//Access Datei auswählen
				JFileChooser JfCoos=new JFileChooser();
				
				
				JfCoos.setFileFilter(new FileFilter() {
		            @Override
		            public boolean accept(File f) {
		                return f.isDirectory() || f.getName().matches(".*\\.(mdb|accdb)");
		            }
		 
		            @Override
		            public String getDescription() {
		                return "*.mdb, *.accdb";
		            }
		        });
				
				JfCoos.showOpenDialog(frame);//Auf dem Frame den Dialog anzeigen
				
				
				filVari=JfCoos.getSelectedFile();//Pfadangabe zur Datei
				
				JLAccessPfad.setText(filVari.toString());
				listModel.addElement("Access Datei ausgewählt");
				
			    File ausgabedatei; 
			    FileWriter fw; 
			    BufferedWriter bw; 
			    
			    
			    //Schreibe den DB Pfad in eine Textdatei
				 try{
				       PrintStream ps = new PrintStream(new FileOutputStream("db_path.log"));
				       

				       String nameAusgabedatei; 
				       
				       File lesedatei; 
				       FileWriter fl; 
				       BufferedWriter bl; 

				       //Wenn eine File ausgewählt wurde soll der DB Pfad in eine Datei gerschrieben werden
				       try { 
				         nameAusgabedatei = "db_path.log"; 
				         lesedatei = new File("db_path.log"); 
				         fl = new FileWriter(lesedatei); 
				         bl = new BufferedWriter(fl); 
				         bl.write(filVari.toString()); 
				         bl.close(); 
				       } 
				       catch (ArrayIndexOutOfBoundsException aioobe) { 
				         System.out.println("Aufruf mit: java SchreibeDatei name"); 
				         System.out.println("erzeugt eine Datei name.html"); 
				       } 
				       catch (IOException ioe) { 
				         System.out.println("Habe gefangen: "+ioe); 
				       } 


				
				
				}catch(Exception ex )
				{
				//JOptionPane.showMessageDialog(frame,ex.toString());
				
				}
			}
				finally{}
			}
			
			
			//Starten des Uploads
			if(e.getSource()==JBstart) 
			{
				String StrDBPasswort;
				String DBPfad;
				
				Connection Con;
				DatabaseMetaData dmd;
				
				
				DBPfad=JLAccessPfad.getText();
				StrDBPasswort=DBPasswort.getText();
				
				
				
			    //Schreibe das DB Passwort in eine Textdatei
				 try{
				       PrintStream ps = new PrintStream(new FileOutputStream("db_passwort.log"));
				       

				       String nameAusgabedatei; 
				       
				       File lesedatei; 
				       FileWriter fl; 
				       BufferedWriter bl; 
				       
				       //Wurde ein Passwort eingegeben soll dies in eine Datei geschrieben werden
				       try { 
				         nameAusgabedatei = "db_passwort.log"; 
				         lesedatei = new File("db_passwort.log"); 
				         fl = new FileWriter(lesedatei); 
				         bl = new BufferedWriter(fl); 
				         bl.write(StrDBPasswort.toString()); 
				         bl.close(); 
				       } 
				       catch (ArrayIndexOutOfBoundsException aioobe) { 
				         System.out.println("Aufruf mit: java SchreibeDatei name"); 
				         System.out.println("erzeugt eine Datei name.html"); 
				       } 
				       				
		
				if (DBPfad=="" || DBPfad==" ")
				{
					JOptionPane.showMessageDialog(frame,"Haben sie eine Access Datei ausgewählt?");					
				}
				
				else
				{
					StrDBPasswort=DBPasswort.getText();
					//System.out.println(StrDBPasswort);
					JPuploadbar.setValue(1);
					
					//Verbindung mit der DB herstellen
					try
					{
						
					Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance ();
					
					JLstatus.setBounds(20, 210, 260, 20);
					
					//JListBOx mit Info über die Verbindung zur Access DB versorgen
					JLstatus.setText("Verbinung Access, Fehler? WM-DB?");
					listModel.addElement("Verbindung Access hergestellt");
					
					// Connection my_con = DriverManager.getConnection("jdbc:odbc:"+ DBPfad);
					 Connection con = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ="+ DBPfad);
					 
					 //Status setzen
					 JLstatus.setText(" Verbindung mit AccDB ok");
					 
					 
					 	Statement stmt = con.createStatement();
					  
				  		ResultSet rs = stmt.executeQuery("SELECT * FROM ergebnisse");
				  		
				  		listModel.addElement("Daten Ergebnisse wurden Selektiert");
				  		
				  		ResultSetMetaData rsmd = rs.getMetaData();
				  		int clmCnt = rsmd.getColumnCount();
				  		
				  		
				  		
				  	//MYSQL
				  	//MYSQL
				  	//MYSQL
				  	//MYSQL
				  	//MYSQL Verbindung
				  		
				  		Connection dbconmysql;
						Driver drvmysql;
						DatabaseMetaData dbmdmysql;
						
						Class.forName("com.mysql.jdbc.Driver").newInstance();
	
						drvmysql=new com.mysql.jdbc.Driver();
						DriverManager.registerDriver(drvmysql);
									
						JLstatus.setText("MySQL Verbindungsfehler: Passwort? Internet?");
						dbconmysql= DriverManager.getConnection("jdbc:mysql://00.00.000.000/"+StrDBPasswort,StrDBPasswort,"xxxx");
						
						listModel.addElement("Verbindung MySQL hergestellt");
						
						dbmdmysql=dbconmysql.getMetaData();
						JLstatus.setText(dbmdmysql.getDatabaseProductName()+ " " +dbmdmysql.getDatabaseProductVersion());
						
						Statement mysql_stmt = dbconmysql.createStatement();
						mysql_stmt.executeUpdate("DELETE FROM Ergebnisse where ID <>0;");
						

						
						//MYSQL
						//MYSQL
						//MYSQL
						//MYSQL
				  		
					

				  	//Vorbereitung für den Upload in der Schleife
				  		String sql_update="INSERT INTO Ergebnisse (";
				  		listModel.addElement("Übertrage nun Ergenisse");
				  		JLstatus.setText("Übertragung Daten läuft");
				  		Integer progress_status=1;
			  			JPuploadbar.setValue(progress_status);
			  			
			  			JPuploadbar.setStringPainted(true);
			  			
			  			
	
			  			ThreadKlasse progress_thread=new ThreadKlasse(this);
			  			
			  			 int iProzent;
			  			
			  			//Access Ergebnismenge in der Schleife abarbeiten und Insert auf MySQL machen	
				  		while (rs.next()) {
				  			//Berechnen des Prozentwertes für Progressbar
				  			iProzent = (int)((100 * progress_status) / clmCnt);
				  			JPuploadbar.setStringPainted(true);
				  			
				  			public int getProzent()
				  			{
				  				return iProzent;
				  			}


				  			JPuploadbar.setStringPainted(true);
				  			
				  			//Spalten namen Abfragen und ein Insert zusammen basteln.
					  		for(Integer x=1;x<=clmCnt-1;x++)
					  		{
					  			sql_update=sql_update+rsmd.getColumnLabel(x)+", ";
					  		
					  		
					  		}
					  		sql_update=sql_update+rsmd.getColumnLabel(clmCnt);
					  		sql_update=sql_update+") VALUES (";
					  		
					  		//Werte für den Insertstring zusammenbasteln
					  		for(Integer y=1;y<=clmCnt-1;y++)
					  		{
					  			sql_update=sql_update+"'"+rs.getString(y)+"',";
					  		
					  		
					  		}
					  		sql_update=sql_update+"'"+rs.getString(clmCnt)+"'";
					  		sql_update=sql_update+");";
					  	
					  	//Insert auf MYSQL durchführen
					  	//sql_update=sql_update+rsmd.getColumnLabel(x)+"="+rs.getString(x)+",";
				  		//System.out.println(sql_update);
				  		mysql_stmt.executeUpdate(sql_update);
				  		
				  		//Zurücksetzen des SQL Insertstrings
					  	sql_update="INSERT INTO Ergebnisse (";
					  	
					  	//Progress Status um eins inkrementieren
					  	progress_status++;
					  	

					  		
				  		}
				  		
				  		//Progress Updater beenden
				  		progress_thread.interrupt();
				  		
				  		//Wenn alles übertragen Satus setzen
				  		listModel.addElement("Übertragung abgeschlossen");
				  		JLstatus.setText("Ergebnisse abgeschlossen");
 
Ja, das habe ich aber auch schon probiert. Es gibt zwar keinen Fehler aber die ProgressBar aktualisiert sich trotzdem erst zum Schluss.
Wenn du willst kann ich dir ja mal das gesamte Projekt schicken. oder posten. Ist alles in einer Klasse bzw. zwei wenn man die Main dazuzählt.
 
Zurück