Threads ProgressMonitor wird nicht angezeigt!

HarleyDavidson

Bekanntes Mitglied
Ich bin am verzweifeln!
Folgende Problematik: Ich habe ein kleines Tool geschrieben, welches Log-Files analysiert und am Ende ein Balkendiagramm ausgibt. Das funktioniert auch wunderschön.
Während der Analyse der Logfiles (welche ja etwas länger dauern kann) wollte ich nun einen Progressmonitor anzeigen.

Hier mal ein KSKB zum selber probieren (gekürzt, selbes Verhalten):

Java:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.ProgressMonitor;

/**
 *
 * @author Dominik Sust
 * @creation 11.08.2014 10:38:05
 */
public class Main_KSKB
{

    private final String version = "1.0";
    //Datumsformat im Logfile
    private String DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";
    //Beginnt das Datum im Log ab dem ersten Zeichen?
    private int DATE_OFFSET = 1;
    //Nach welchem String soll gesucht werden?
    private String SEARCHSTRING = "Validiere ";
    //Name der App
    private String APPNAME = "APPNAME";

    private final TreeMap<Integer, Integer> statistic = new TreeMap<Integer, Integer>();
    private Date firstDate = new Date();
    private Date lastDate = new Date();
    private SimpleDateFormat sdf;
    private SimpleDateFormat sdf_result = new SimpleDateFormat( "dd.MM.yyyy" );

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args )
    {

        Main_KSKB m = new Main_KSKB();
        m.init();
        //m.analyze();
    }
    private JFrame frame;
    private JTextField t_name;
    private JTextField t_datum;
    private JTextField t_datumoffset;
    private JTextField t_suchstring;
    public static int file_counter = 1;
    public static int total;

    public Main_KSKB()
    {
        for ( int i = 0; i < 24; i++ )
        {
            statistic.put( i, 0 );
        }
        sdf = new SimpleDateFormat( DATEFORMAT );

    }

    private void init()
    {
        frame = new JFrame( "AppActivity - Version " + version );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        GridLayout gl = new GridLayout( 5, 2, 5, 5 );
        frame.setLayout( gl );
        JLabel l_name = new JLabel( "Name der App: " );
        t_name = new JTextField();
        frame.add( l_name );
        frame.add( t_name );
        JLabel l_datum = new JLabel( "Aufbau des Datumsstrings: " );
        t_datum = new JTextField();
        frame.add( l_datum );
        frame.add( t_datum );
        JLabel l_datumoffset = new JLabel( "Offset Datumsstrings: " );
        t_datumoffset = new JTextField();
        frame.add( l_datumoffset );
        frame.add( t_datumoffset );
        JLabel l_suchstring = new JLabel( "Suchstring: " );
        t_suchstring = new JTextField();
        frame.add( l_suchstring );
        frame.add( t_suchstring );
        JButton b_ok = new JButton( "OK" );
        b_ok.addActionListener( new ActionListener()
        {

            @Override
            public void actionPerformed( ActionEvent e )
            {
                frame.dispose();
                analyze();
            }
        } );
        frame.add( b_ok );
        JButton b_cancel = new JButton( "Abbruch" );
        b_cancel.addActionListener( new ActionListener()
        {

            @Override
            public void actionPerformed( ActionEvent e )
            {
                System.exit( 0 );
            }
        } );
        frame.add( b_cancel );
        frame.pack();
        frame.setLocationRelativeTo( null);
        frame.setVisible( true );
    }

    public void analyze()
    {
//        DATEFORMAT = t_datum.getText();
//        DATE_OFFSET = Integer.valueOf( t_datumoffset.getText().trim() );
//        APPNAME = t_name.getText();
//        SEARCHSTRING = t_suchstring.getText();

        //Erstellung der fileList

        total = 9;
        ProgressMonitor pm = new ProgressMonitor( null, "Analysiere...", "Fortschritt", 1, total );

        //for ( File current : fileList )
        for ( int i = 0; i < 10; i++ )
        {
            //Analyse wird durchgeführt
            
            try
            {
                Thread.sleep( 500 );
            }
            catch ( InterruptedException ex )
            {
                Logger.getLogger( Main_KSKB.class.getName() ).log( Level.SEVERE, null, ex );
            }

            file_counter++;
            pm.setProgress( file_counter );
        }
        System.out.println( statistic.toString() );
        System.out.println( "First Date: " + sdf.format( firstDate ) );
        System.out.println( "Last Date: " + sdf.format( lastDate ) );

        buildResultFrame();

    }

    private void buildResultFrame()
    {
        JFrame f2 = new JFrame( "Ergebnis" );
        f2.setSize( new Dimension(100, 100));
        f2.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f2.setLocationRelativeTo( null);
        f2.setVisible( true );
    }
}

Wenn ihr das so ausführt, dann aktualisiert sich der ProgressMonitor nicht und man sieht nur ein graues Fenster.

Wenn ihr Zeile 47 auskommentiert und Zeile 48 wieder aktiviert, dann seht ihr den wunderschönen ProgressMonitor, so wie er es soll.

Jetzt hab ich schon viel versucht: Auslagerung der Analyse in einen anderen Thread, Auslagerung des ProgressMonitors in einen anderen Thread... Nichts funktioniert!

Ich hoffe jemand von der Community kann mir weiterhelfen.

Ich freue mich auf eure Beiträge!
 

Joose

Top Contributor
Das
Code:
Thread.sleep()
in der analyze Methode blockiert das Aktualisieren der GUI.

Diese Methode in einen Thread auslagern und dann sollte es funktionieren :)
Weil du sagst das hat nicht funktioniert -> Wie hast du es denn probiert? Vielleicht war da nur ein kleiner Fehler drinnen.
 
Zuletzt bearbeitet:

HarleyDavidson

Bekanntes Mitglied
Normalerweise werden hier die Txt-Files durchsucht. Das Thread.sleep() hab ich nur eingebaut, um die Zeit zu simulieren.
Gerne kann das durch eine große for-Schleife mit Berechnung ausgetauscht werden.
 

Joose

Top Contributor
Trotzdem deine GUI läuft im EDT und dieser ist für die Aktualisierung der GUI zuständig. Wenn du nun in diesem EDT einen langen Task (oder auch einfach sleeps) ausführst wird die Aktualisierung der GUI geblockt.
Daher sind lange Tasks immer auszulagern.
 

Thallius

Top Contributor
Du wirst dich in SwingWorker einarbeiten müssen. Da kommst du nicht drum herum auch wenn es relativ schwer zu verstehen ist wenn man sich mit Multi-Threading nicht auskennt.

Gruss

Claus
 

HarleyDavidson

Bekanntes Mitglied
Danke an Thallius, dein Hinweis war Gold wert.
Mit dem SwingWorker konnte ich das gewünschte Verhalten implementieren.

Hier nun nochmals das KSKB, so wie es funktionieren soll.

Vielleicht ist der SwingWorker hier ein klein wenig "missbraucht", eventuell bekomme ich hier noch den ein oder anderen BestPractice - Tipp:

Java:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;

/**
 *
 * @author Dominik Sust
 * @creation 12.08.2014 11:10:05
 */
public class Main_KSKB
{

    private final String version = "1.0";
    //Datumsformat im Logfile
    private String DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";
    //Beginnt das Datum im Log ab dem ersten Zeichen?
    private int DATE_OFFSET = 1;
    //Nach welchem String soll gesucht werden?
    private String SEARCHSTRING = "Validiere ";
    //Name der App
    private String APPNAME = "APPNAME";

    private final TreeMap<Integer, Integer> statistic = new TreeMap<Integer, Integer>();
    private Date firstDate = new Date();
    private Date lastDate = new Date();
    private SimpleDateFormat sdf;
    private SimpleDateFormat sdf_result = new SimpleDateFormat( "dd.MM.yyyy" );

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args )
    {

        Main_KSKB m = new Main_KSKB();
        m.init();
        //m.analyze();
    }
    private JFrame frame;
    private JTextField t_name;
    private JTextField t_datum;
    private JTextField t_datumoffset;
    private JTextField t_suchstring;
    public static int file_counter = 1;
    public static int total;

    public Main_KSKB()
    {
        for ( int i = 0; i < 24; i++ )
        {
            statistic.put( i, 0 );
        }
        sdf = new SimpleDateFormat( DATEFORMAT );

    }

    private void init()
    {
        frame = new JFrame( "AppActivity - Version " + version );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        GridLayout gl = new GridLayout( 5, 2, 5, 5 );
        frame.setLayout( gl );
        JLabel l_name = new JLabel( "Name der App: " );
        t_name = new JTextField();
        frame.add( l_name );
        frame.add( t_name );
        JLabel l_datum = new JLabel( "Aufbau des Datumsstrings: " );
        t_datum = new JTextField();
        frame.add( l_datum );
        frame.add( t_datum );
        JLabel l_datumoffset = new JLabel( "Offset Datumsstrings: " );
        t_datumoffset = new JTextField();
        frame.add( l_datumoffset );
        frame.add( t_datumoffset );
        JLabel l_suchstring = new JLabel( "Suchstring: " );
        t_suchstring = new JTextField();
        frame.add( l_suchstring );
        frame.add( t_suchstring );
        JButton b_ok = new JButton( "OK" );
        b_ok.addActionListener( new ActionListener()
        {

            @Override
            public void actionPerformed( ActionEvent e )
            {
                frame.dispose();
                analyze();
            }
        } );
        frame.add( b_ok );
        JButton b_cancel = new JButton( "Abbruch" );
        b_cancel.addActionListener( new ActionListener()
        {

            @Override
            public void actionPerformed( ActionEvent e )
            {
                System.exit( 0 );
            }
        } );
        frame.add( b_cancel );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public void analyze()
    {
        //Erstellung der fileList
        SwingWorker sw = new SwingWorker()
        {

            @Override
            protected Object doInBackground() throws Exception
            {
                total = 9;
                ProgressMonitor pm = new ProgressMonitor( null, "Analysiere...", "Fortschritt", 1, total );

                //for ( File current : fileList )
                for ( int i = 0; i < 10; i++ )
                {
                    //Analyse wird durchgeführt

                    try
                    {
                        Thread.sleep( 500 );
                    }
                    catch ( InterruptedException ex )
                    {
                        Logger.getLogger( Main_KSKB.class.getName() ).log( Level.SEVERE, null, ex );
                    }

                    file_counter++;
                    pm.setProgress( file_counter );
                }
                System.out.println( statistic.toString() );
                System.out.println( "First Date: " + sdf.format( firstDate ) );
                System.out.println( "Last Date: " + sdf.format( lastDate ) );
                return null;
            }

            @Override
            protected void done()
            {
                buildResultFrame();
            }
        };
        sw.execute();
    }

    private void buildResultFrame()
    {
        JFrame f2 = new JFrame( "Ergebnis" );
        f2.setSize( new Dimension( 100, 100 ) );
        f2.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f2.setLocationRelativeTo( null );
        f2.setVisible( true );
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N ProgressMonitor Allgemeine Java-Themen 20
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Y MVVM wie wird Eventhandler tausch geregelt Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
N warum wird es doppelt ausgegeben Allgemeine Java-Themen 6
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
N Eingabe wird immer als "false" ausgegeben Allgemeine Java-Themen 6
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
hello_autumn Java_Home geändert auf Java 13, trotzdem wird Java Version 8 angezeigt. Allgemeine Java-Themen 2
Thallius Char +1 wird int? Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
S If-Menü wird doppelt ausgegben Allgemeine Java-Themen 4
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
kodela Klassen Klassenvariable wird nicht gesetzt Allgemeine Java-Themen 23
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
kodela Drücken der ALT-Taste wird nur bei jedem zweiten Mal erkannt Allgemeine Java-Themen 5
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
D Cursor unsichtbar, wenn Kontextmenü aufgerufen wird Allgemeine Java-Themen 5
K Arbeitsspeicher wird langsam voll Allgemeine Java-Themen 6
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
N Datentypen If-Statement wird "übersprungen" Allgemeine Java-Themen 2
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Java wird nicht gefunden Allgemeine Java-Themen 32
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
Sin137 Interface Eingabe wird doppelt angezeigt Allgemeine Java-Themen 2
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
U Erkennen, ob PC benutzt wird Allgemeine Java-Themen 4
O Programm wird einfach "gekillt" Allgemeine Java-Themen 3
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
B Abfragenteil wird nicht aufgerufen Allgemeine Java-Themen 2
Todesbote JFileChooser im Vordergrund (*.jar wird mittels shell_exec in PHP aufgerufen) Allgemeine Java-Themen 1
T Sicherheitshinweis - Zertifikat wird angefordert Allgemeine Java-Themen 5
L SetBounds wird vor dem Konstruktorcode aufgerufen - Wenn Startleiste links Allgemeine Java-Themen 1
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
A Long variable wird negativ??? Allgemeine Java-Themen 1
J CSV Datei wird ungewollt umformatiert Allgemeine Java-Themen 5
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
gamebreiti Swing JLabel wird nicht angezeigt Allgemeine Java-Themen 4
I Java Applet wird immer blockiert Allgemeine Java-Themen 3
E Java Editor Klasse wird nicht weiter ausgeführt Allgemeine Java-Themen 4
S Java Applet wird dauerhaft blockiert Allgemeine Java-Themen 1
I Datei wird nicht richtig gelöscht Allgemeine Java-Themen 7
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
D Input/Output Datei wird lokal aber nicht vom Webserver ausgelesen... Allgemeine Java-Themen 2
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
I Projekt wird nicht erstellt Allgemeine Java-Themen 2
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
A Threads Log4J Logger wird "überschrieben" Allgemeine Java-Themen 3
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
J batch datei wird nicht aufgerufen Allgemeine Java-Themen 11
M Datei wird nicht vollständig geschrieben (FileOutputStream, OutputStreamWriter, Encoding) Allgemeine Java-Themen 6
P OSGi - Bundle-Methode wird nicht aufgerufen Allgemeine Java-Themen 3
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
T Variablen Variable wird als nicht genutzt angezeigt Allgemeine Java-Themen 8
J Slideshow wird im IE überblendet Allgemeine Java-Themen 4
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
J Textdatei auslesen, die gerade benutzt wird Allgemeine Java-Themen 8
M CapsLock abfragen wenn Fenster wieder aktiviert wird Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben