Zwei Thread's gleichzeitig laufen lassen

Hallo alle zusammen

mein problem ist folgendes ich habe ein JFrame und eine Klasse zum löschen der Dateien .
Wenn ich das Programme starte werden erst die Dateien gelöscht und dann das jFrame angezeigt. Es soll aber beides gleichzeitig laufen.

ich habe folgendes Probiert:


import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class Daten_Delete_ende_GUI extends javax.swing.JFrame {

 
    public Daten_Delete_ende_GUI() throws IOException {
        initComponents();
        setLocationRelativeTo(null);
        
        String bild = "pics/Euro_3D_Blue.png";
        super.setIconImage(ImageIO.read(Daten_Delete_ende_GUI.class.getResourceAsStream(bild)));
        
        
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1.setForeground(new java.awt.Color(102, 255, 102));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabel1.setText("TEST TEXT TEST TEXT TEST TEXT TEST TEXT");
        jLabel1.setName(""); // NOI18N
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 160, 300, -1));

        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/daten_delete_ende_gui/pics/Splash.png"))); // NOI18N
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, -1, -1));

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Daten_Delete_ende_GUI().setVisible(true);
                    Thread.sleep(1000);
                    new DatenDelete();
                } catch (IOException ex) {
                    Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Daten_Delete_ende_GUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            
        });
    }

    // Variables declaration - do not modify                     
    public static javax.swing.JLabel jLabel1;
    public static javax.swing.JLabel jLabel2;
    // End of variables declaration                   

   
}```

Kann mir jemand weiter helfen oder hat vielleicht jemand schon mal ein solches problem gehabt

vielen danke für eure mühe

setze z.B. die Zeilen 78 + 79

new DatenDelete();

ans Ende der main-Methode, der main-Thread kann das gut machen, ist sonst zu Ende,
durch das Warten ist genug Zeit für das invokeLater()

alternativ kann man auch immer einen Thread neu starten, auch etwa vom Ende des invokeLater() aus, um ganz sicherzugehen,
mit Code wie überall in Tutorials zu finden


kontraproduktiv ist hier nur, die Arbeit im invokeLater() dem AWT-Thread aufzuhalsen,
solange der beschäftigt ist kann er die GUI nicht zeichen, schon gar nicht Updates,

das initiale Erstellen inklusive setVisible(true) ist wichtig, korrekt vom AWT-Thread aus, aber nicht für sich genug,
da passiert noch mehr, aber nur wenn der AWT-Thread die Luft bekommt

Danke hat Funktioniert

Also ich würde an deiner Stelle mit dem SwingWorker arbeiten. Dieser arbeitet intern mit einem ExecutorService. Musst mal in die Implementierung des SwingWorkers gucken.

Einfaches Besipiel, um die Gui bei komplexeren Aktionen nicht zu blockieren:

        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(String.format("hello world from - %s", "Executors"));
        });

…und per SwingWorker dann so:

        SwingWorker swingWorker = new SwingWorker<Boolean, String>() {
            @Override
            protected Boolean doInBackground() throws Exception {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publish(String.format("hello world from - %s", "SwingWorker"));
                return true;
            }

            @Override
            protected void process(List<String> chunks) {
                System.out.println(chunks);
            }

            @Override
            protected void done() {
                System.out.println("fertig");
            }
        };
        swingWorker.execute();

Ich würde da nix mehr mit dem AWT Zeug machen. Dazu gehört auch dieser komische EventQueue. :slight_smile:

viele Grüße
Steven

Der Code ist ja offensichtlich automatisch generiert (manche Leute glauben, sich damit Arbeit zu sparen ;-)). Ich denke, das, was dort erreicht werden soll, könnte man mit ca. 15 Zeilen erreichen, in denen irgendwo JOptionPane.showMessageDialog(…) vorkommt…