jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist...

dior

Bekanntes Mitglied
Hallo,

ich habe ein kleines "grundsätzliches" Problem....

Ich habe ein Prog welches mir nach Buttonklick in meiner GUI eine SQL Abfrage startet und wenn fertig diese in einer jTable darstellt.
Zusätzlich habe ich einen jProgressBar welcher mir in der zwischenzeit bis die Abfrage fertig ist erfolgreich "hochläuft"

aber die Zeit die der ProgressBar hochläuft ist jetzt von mir eher auf die Holzhammermethode fix eingestellt und ganz und gar nicht dynamisch .... (habe noch mehrere Abfragen für die will ich das so nicht machen)

Ich würde gerne abhängig von der Abfrage die Werte so anpassen das der Progressbar immer bei 100% ist wenn die Abfrage fertig ist.

Hier mein Code für den Progressbar und den Start der Abfrage (die Abfrage selbst läuft in einer anderen Klasse ab...

der whileWert... ich habe mir durch System.out.println("Wert: " +value); angeschaut wann ca. die Abfrage fertig ist und den wert hergenommen
und durch probieren usw. dann das so eingestellt das es ca gleichzeitig fertig ist...... aber ist natürlich eigentlich "Käse"....

Java:
.
.
private void btnAPActionPerformed(java.awt.event.ActionEvent evt) {

class UpdateProgressBar1 extends Thread {

    int whileWert = 316755;
    int updateWert = whileWert/100;
    public void run() {
        jProgressBar1.setValue(0);
        int value = 0;
        
        int i = 0;
      while(i < whileWert){
      value = value + 1;
    jProgressBar1.setValue(value/updateWert);
    i++;
    System.out.println("Wert: "  +value);
//            try {
//                Thread.sleep(1);
//            } catch (InterruptedException ex) {
//                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
//            }
      }
    
          }}

      
      new UpdateProgressBar1().start();
        
        
        Thread queryThread = new Thread() {
      public void run() {

        
        exportHeader = Objekte.SQLs.apExportHeader;
        spaltenCount = Objekte.SQLs.apSpaltenCount;
        objektName = Objekte.SQLs.apobj;
        try {
                Stro.CursorToolkitOne.startWaitCursor(rootPane); // setzt die Sanduhr beim Cursor an
           
                AlleObjekte AP = new AlleObjekte(Objekte.SQLs.apSelect, Objekte.SQLs.apCountSelect, objektName);
      
           //     jProgressBar1 = new jProgressBar();
                Stro.CursorToolkitOne.stopWaitCursor(rootPane); // schaltet die Sanduhr beim Cursor aus und wieder den StandartMauszeiger
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
         // Objekte.SQLs.AP();
        }
    };
    queryThread.start();
  
    }


Ich hoffe es ist halbwegs verständlich erklärt.... und ich hoffe es gibt eine lösung wie ich das quasi dynamisch so einstellen kann da egal welche Abfrage ich starte der progressBar immer bei 100% ist wenn die abfrage bzw. die jTable fertig ist
 
Da ja niemand wissen kann wie lange die Abfrage dauert wird es schwer.
Man könnte mit
Code:
setIndeterminate(true)
an der JProgressBar dem Anwender zumindest signalisieren, dass sich etwas tut. Wenn Du dann mal weißt wie viele Datensätze die Abfrage liefert, könnte man - wenn es sich überhaupt noch lohnt - den Modus wechseln.
Ansonsten kann man ja nur raten, den Wert langsam bis 99% laufen lassen und solange warten bis der Prozess tatsächlich abgearbeitet ist. ;-)
 
Ich weiß zumindest bei jeder Abfrage wieviele Datenstäze in etwa zurückommen.....
Wie könnte ich das dann einbauen?
 
Du setzt sie auf 0, wenn die Abfrage fertig ist, setzt du sie auf 50, wenn der Table gefüllt ist, auf 100.
 
Ich weiß zumindest bei jeder Abfrage wieviele Datenstäze in etwa zurückommen.....
Wie könnte ich das dann einbauen?
Eine quick&dirty Demo:
Java:
import java.awt.BorderLayout;

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

public class JProgressDemo {
	public static void main(String[] s) {
		new JProgressDemo().startDemo();
	}
	
	public void startDemo() {
		JFrame frame = new JFrame(this.getClass().getSimpleName());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 300, 150);
		frame.setLocationRelativeTo(null);
		label = new JLabel("Datenbankabfrage gestartet", JLabel.CENTER);
		progress = new JProgressBar();
		frame.add(label, BorderLayout.CENTER);
		frame.add(progress, BorderLayout.SOUTH);
		frame.setVisible(true);
		
		startDBProcess();
	}
	
	private void startDBProcess() {
		final int rowsCount = 666; //dummy
		progress.setMaximum(rowsCount);
		// Dummy Thread fuer Datenbankabfrage
		new Thread(new Runnable() {
			public void run() {
				progress.setIndeterminate(true);
				try { //Datenbankabfrage
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				progress.setIndeterminate(false);
				label.setText("Lese Daten...");
				for (int i=0; i<rowsCount; i++) {
					try { //Auslesen des ResultSets
						Thread.sleep(50);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					progress.setValue(i+1);
				}
				label.setText("Fertig");
			}
		}).start();
	}
	
	private JLabel label;
	private JProgressBar progress;
}
 

Zurück
Oben