GUI Ladestatus + Thread

Status
Nicht offen für weitere Antworten.

tom g.

Aktives Mitglied
Hallo Forum,

vorweg, ich habe schon hier gesucht, komme aber irgendwie nicht klar.

Ich möchte den Ladestatus meiner GUI im SplashScreen darstellen.

Hier mal der Code der Main Klasse:

Code:
package sys;

import java.io.File;
import sys.cls.IniRecource;
import sys.frm.TransparentWindow;
import sys.frm.MainFrame;
import javax.swing.*;


public class Main {
    /* Konstanten definition */
    public static boolean DEBUG_STATE = true;
    public static String PATH_TO_INI = System.getProperty("user.dir") + File.separator + "ini.xml";
    public static IniRecource INI_RESOURCE = new IniRecource(PATH_TO_INI);
    /*variablen deklarieren */
    
    private Thread tIni,tSplash,tMainFrame;
    private TransparentWindow tw;
    private MainFrame mf;
    /** Creates a new instance of Main */
    public Main() {
       System.out.println("Starte CP JImageResizer");
        
        //Splashscreen öffnen
        tw = new TransparentWindow();// Initialisieren des Fensters
        tSplash = new Thread(tw); 
        tSplash.run(); //anzeigen des Fensters this.setVisible(true);
        
        
        //Ini.xml lesen
        tIni = new Thread(INI_RESOURCE);
        tIni.run();
        
        // GUI erzeugen
        mf = new MainFrame(); //Initialisieren des Fensters
        tMainFrame = new Thread(mf); //Initialisieren des Threads
        tMainFrame.run(); //Fenster anzeigen this.setVisible(true);
        tw.stop(); //ausblenden des SplashScreens this.setVisible(false);
        tSplash.interrupt(); // beenden des tSplash Threads
       
    }
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new Main();
    }
    
}

Jetzt meine Fragen

In
Code:
 //Splashscreen öffnen
        tw = new TransparentWindow();// Initialisieren des Fensters
        tsplash = new Thread(tw); 
        tsplash.run(); //anzeigen des Fensters this.setVisible(true);

wird das Fenster ja schon bei tw = new TransparentWindow() initialisiert und dann nur bei tsplash.run angezeigt.

Sollte ich lieber das Initialisieren durch die tsplash.run() - Methode aufrufen und am Ende this.setVisible(true) setzen.

Wie bekomme ich heraus, wie lange der Thread zum Initialisieren des MainFrames brauch, und wie setze ich dann das Value der JProgressbar im Splashscreen.

Damit meine ich nicht tw.setValue(int i); sondern was in int i reinkommt.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.

Danke

Tom
 

André Uhres

Top Contributor
Wie lange eine Startup dauern wird lässt sich (mit und ohne Kristallkugel) wohl schwer voraussagen,
daher bietet JProgressBar die Methode "setIndeterminate" an:
Code:
package splash;
/*
 * Main.java
 */
import java.io.File;
import javax.swing.*;
public class Main {
    /* Konstanten definition */
    final private static boolean DEBUG_STATE = true;
    final private static String PATH_TO_INI = System.getProperty("user.dir") + File.separator + "ini.xml";
    final private static IniRecource INI_RESOURCE = new IniRecource(PATH_TO_INI);
    /*variablen deklarieren */
    private Thread tIni,tSplash,tMainFrame;
    private TransparentWindow tw;
    private MainFrame mf;
    public Main() {
        System.out.println("Starte CP JImageResizer");

        //Splashscreen öffnen:
        tw = new TransparentWindow();
        tw.setVisible(true);

        //Ini.xml lesen:
        tIni = new Thread(INI_RESOURCE);
        tIni.start();//<------------------ein Thread wird mit start() getstartet!!!
        // GUI erzeugen:
        mf = new MainFrame(); //Fenster erzeugen
        tMainFrame = new Thread(mf); //Initialisieren des Threads
        tMainFrame.start();//<------------ein Thread wird mit start() getstartet!!!

        try {
            //Warten bis alle Threads fertig sind:
            tIni.join();
            tMainFrame.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        //Ausblenden des SplashScreens:
        tw.dispose();
    }
    public static void main(final String[] args) {new Main();}
}
class IniRecource implements Runnable{
    private String str;
    public IniRecource(final String str){
        this.str = str;
    }
    public void run() {
        try {Thread.sleep(3000);} catch (InterruptedException ex) {}
    }
}
class TransparentWindow extends JWindow {
    public TransparentWindow(){
        setSize(400,20);
        setLocationRelativeTo(null);
        JProgressBar progress = new JProgressBar();
        progress.setIndeterminate(true);
        progress.setString("Starte CP JImageResizer...");
        progress.setStringPainted(true);
        add(progress);
    }
}
class MainFrame extends JFrame implements Runnable{
    public void run() {
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("MainFrame");
        try {Thread.sleep(4000);} catch (InterruptedException ex) {}
        setVisible(true);
    }
}
 

tom g.

Aktives Mitglied
Hallo André,
André Uhres hat gesagt.:
Wie lange eine Startup dauern wird lässt sich (mit und ohne Kristallkugel) wohl schwer voraussagen,
daher bietet JProgressBar die Methode "setIndeterminate" an:

soweit so gut. Das habe ich verstanden. Wie aber stelle ich es an, das es
so wie bei Netbeans ist.

Ist dort die Anzeige der JProgessBar in etwa so geplant worden?

JProgressbar

max = 100

Threads z.B. 5

pro Thread = 20

Wenn Thread fertig, dann current = current + 20.

Frage((n)zeichen) über Fragen((n)zeichen).

Danke schon mal.

Tom
 

André Uhres

Top Contributor
Eine Progressbar zeichnet naturgemäss nur einen einzigen Thread.
Um mehreren Threads zu zeichnen, müsste man mehrere Progessbars haben, was wohl selten jemand so macht.
Man zeichnet also nur den Hauptthread, also den, welcher voraussichtlich am längsten läuft.
Du Kannst z.B. dem MainFrame die Referenz "tw" im Konstruktor mitgeben und beim Laden der GUI
an passenden Stellen eine Methode aus TransparentWindow aufrufen,
die die Progressbar auf einen geschätzten Wert setzt.

EDIT: Ich bin mir jetzt aber nicht sicher, ob du den Sinn von Threads erfasst hast:
Threads macht man, um mehrere Prozesse parallel, also quasi gleichzeitig laufen zu lassen.
Wenn man das Resultat von einem Thread braucht, muss man natürlich warten, bis er fertig ist (join).
 

tom g.

Aktives Mitglied
Hallo,

hab's schon verstanden. Ist bei mir aber eine Mischung.

Thread 1 ruft den SplashScreen auf.
Thread 2 läd die ini-Datei.
Thread 3 wartet auf 2 und schreibt werte in die ini.
Thread 4 wartet auf 3 und läd das Hauptfenster.
HauptFenster fertig Thread 4 bleibt bestehen und Thread1 wird geschlossen.

Habe mir jetzt eine Klasse GUIThread extends Thread geschrieben. Der wird eine Instans des Objectes, ein String
und eine Instans des TransparentWindow-Objektes übergeben. Ich hole mir die Millisekunden des Threads und
übergebe diese an die JProgressBar.

Funzt alles so weit.

Nur wie kann ich in der übergebenen Objekt Instans die run() - Methode aufrufen? object.start() geht nicht.

Hier mal der Code der Klasse. (nicht erschlagen falls es Quatch ist ;-) )

Code:
package sys.cls;

/**
 * GUIThread.java
 * @author cttogo
 * Created on 22. März 2007, 20:25
 */
import java.util.*;
import sys.frm.TransparentWindow;

public class GUIThread extends Thread{
    private long mmSecStart;
    private long mmSecStop;
    private long mmTemp;
    private String infoText = "";
    private TransparentWindow tw;
    private Object object = null;
    /** Creates a new instance of GUIThread */
    public GUIThread(Object o,String s,TransparentWindow itw) {
        tw = itw;
        infoText = s;
        object = o;
    }
    
    public void stoppe() {
        System.out.println("Stoppe Thread " + infoText);
        mmSecStop = System.currentTimeMillis();
        tw.setLabel("Programm wird gestartet");
        try {Thread.sleep(3000);} catch (InterruptedException ex) {}
        tw.setPCurrent(tw.getPMax());
    }
    public void starte() {
        tw.setLabel(infoText);
        System.out.println("Starte Thread " + infoText);
        mmSecStart = System.currentTimeMillis() + tw.getPCurrent();
    }
    private void setProgressBar(){
        if((System.currentTimeMillis() - mmSecStart) > mmTemp){
            mmTemp = System.currentTimeMillis()- mmSecStart;
            tw.setPCurrent( (int) Math.round(System.currentTimeMillis() - mmSecStart) ) ;
            System.out.println((int) Math.round(System.currentTimeMillis() - mmSecStart) + " : " 
+ (int) Math.round(mmTemp) );
        }
    }
    public void run(){
        object.run();
        starte();
        while (this.isAlive() ){
            setProgressBar();
        }
        stoppe();
    }
}

object.run kann Netbeans nicht parsen.

Tom
 

André Uhres

Top Contributor
Am besten, du übergibst nicht den Runnable, sondern gleich den Thread:
((Thread)object).start();
oder object gleich als Thread deklarieren :wink:
 

tom g.

Aktives Mitglied
Ich habe das Problem gelöst.

Die Klasse GUIThread
Code:
import java.util.*;
import sys.frm.TransparentWindow;
import sys.Main;


public class GUIThread extends Thread{
    private long mmSecStart;
    private long mmSecStop;
    private long mmTemp;
    private String infoText = "";
    private TransparentWindow tw;
    private boolean bLast;
    private Thread tTemp;
    private Main main;
    
    
    /** 
     * Instanziert ein neues Objekt von GUIThread 
     **/
    public GUIThread(TransparentWindow itw){ //der SplashScreen
     
        tw = itw;
    }
    
    //Stop die Anzeige für das Modul.
    //Wenn bLast == true wird die Stopvariable in der Mainklasse gestzt.
    public void stoppe() {
        mmSecStop = System.currentTimeMillis();
        if(bLast){
            tw.setPCurrent(tw.getPMax());
            tw.setLabel("Programm wird gestartet");
            try {Thread.sleep(1800);} catch (InterruptedException ex) {} //Splash noch 1.8 Secunden anzeigen
            main.WAIT_OF_MAINFRAME = false;
        }
        
    }
    
    //Startet die Anzeige für das Modul
    public void starte() {
        tw.setLabel(infoText);
        mmSecStart = System.currentTimeMillis() + tw.getPCurrent();
        while(tTemp.isAlive() && main.MAINFRAME_READY == false){
            setProgressBar();
        }
        stoppe();
        
    }
    
    //Übergibt der Progressbar das Value
    private void setProgressBar(){
        if((System.currentTimeMillis() - mmSecStart) > mmTemp){
            mmTemp = System.currentTimeMillis()- mmSecStart;
            tw.setPCurrent( (int) Math.round(System.currentTimeMillis() - mmSecStart) ) ;
            System.out.println((int) Math.round(System.currentTimeMillis() - mmSecStart) + " : " + (int) Math.round(mmTemp) );
        }
    }
    
    //Setzt den laufenden Thread
    public void setThread(Thread t){
        tTemp = t;
    }
    
    //Übergibt ob das aufrufende Modul das letzte Modul ist
    public void setLast(boolean b){
        bLast = b;
    }
    
    //Setzt den angezeigten Info String
    public void setString(String s){
        infoText = s;
    }
    
    //Startet GUIThread
    public void run(){
        
    }
    
}

@André

THX

Hast mir sehr geholfen.

Tom
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Thread mit Button anhalten und wieder neu starten lassen AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben