2016-12-23 15 views
1

Warum funktioniert mein Thread nicht?Warum funktioniert mein Thread nicht?

Ich möchte eine Nachricht auf JFrame für eine kurze Zeit .. dann möchte ich die Nachricht zu schließen und starten meine Haupt JPanel.

Sollte ich den Thread außerhalb meiner Hauptklasse platzieren?

Ich suchte auf Google über mehr..aber ich bin hoffnungslos.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class SwitchCheck { 

    public static void main(String[] args) { 

     final JFrame JF = new JFrame("SwitchJpanel"); 
     JF.setSize(300, 200); 
     JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Thread Cl = new Thread() { 
      public void run() { 
       try { 
        JPanel P = new JPanel(null); 
        JF.getContentPane().add(P); 
        JButton L = new JButton("Wellcome"); 
        L.setBounds(20, 30, 100, 20); 
        P.add(L); 
        sleep(10000000); 
       } catch (Exception e) { 

       } 
      } 
     }; 
     Cl.start(); 
     JF.getContentPane().removeAll(); 
     JF.getContentPane().revalidate(); 
     final JPanel P1 = new JPanel(null); 
     JF.getContentPane().add(P1); 
     JLabel L1 = new JLabel("Left"); 
     L1.setBounds(10, 20, 100, 20); 
     P1.add(L1); 
     JLabel L2 = new JLabel("Right"); 
     L2.setBounds(120, 20, 100, 20); 
     P1.add(L2); 
     final JButton B1 = new JButton("Panel1"); 
     B1.setBounds(20, 60, 100, 20); 
     P1.add(B1); 
     final JButton B2 = new JButton("Panel2"); 
     B2.setBounds(120, 60, 100, 20); 
     P1.add(B2); 
     B1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       JF.getContentPane().removeAll(); 
       JPanel P1 = new JPanel(null); 
       JF.getContentPane().add(P1); 
       JF.getContentPane().revalidate(); 
       JLabel L1 = new JLabel("Left"); 
       L1.setBounds(10, 20, 100, 20); 
       P1.add(L1); 
       JLabel L2 = new JLabel("Right"); 
       L2.setBounds(120, 20, 100, 20); 
       P1.add(L2); 
       B1.setText("Panel1"); 
       B1.setBounds(20, 60, 100, 20); 
       P1.add(B1); 
       B2.setText("Panel2"); 
       B2.setBounds(120, 60, 100, 20); 
       P1.add(B2); 
      } 

     }); 
     B2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       JF.getContentPane().removeAll(); 
       JPanel P2 = new JPanel(null); 
       JF.getContentPane().add(P2); 
       JF.getContentPane().revalidate(); 

       JLabel L3 = new JLabel("UP"); 
       L3.setBounds(10, 20, 100, 20); 
       P2.add(L3); 
       JLabel L4 = new JLabel("Down"); 
       L4.setBounds(120, 20, 100, 20); 
       P2.add(L4); 
       B1.setText("Panel3"); 
       B1.setBounds(20, 60, 100, 20); 
       P2.add(B1); 
       B2.setText("Panel4"); 
       B2.setBounds(120, 60, 100, 20); 
       P2.add(B2); 

      } 

     }); 
     JF.setResizable(false); 
     JF.setVisible(true); 
    } 

} 

Antwort

4

Sie haben mehrere Fehler im Code:

  1. Sie ausführen den gesamten Code in main Methode.

  2. Sie folgen nicht den Oracle naming conventions wo Variablennamen in lowerCamelCase sein sollte

  3. Sie richten alle Komponenten Grenzen manuell, während diese wie die beste und einfachste Weg, scheinen könnte eine komplexe GUI zu machen, wenn Swing zu lernen, ist dies nicht der richtige Weg, stattdessen verwenden Sie eine Layout manager oder Kombinationen von ihnen sowie Empty borders, wenn für den Abstand erforderlich, muss Swing in mehreren Bildschirmgrößen, PLAFs und Auflösungen arbeiten.

  4. Ich möchte eine Nachricht auf JFrame für eine kurze Zeit zeigen .. dann möchte ich die Nachricht schließen und starten meine Haupt JPanel.

    Es scheint, wie das, was Sie tun möchten, ist eine Dialog mit einem auto close verwenden nach einiger Zeit

  5. Aus dem obigen Punkt passiert hat, wollen Sie nicht ein Thread aber ein Swing Timer verwenden.

    Thread.sleep(...) wird Ihr Programm "einfrieren", bis es fertig ist, während ein Timer in einem eigenen Thread ausgeführt wird.

  6. Sie setzen Ihr Programm nicht auf den Event Dispatch Thread (EDT)

+0

Danke .. ich über Swing-Timer nicht weiß .. Ich benutze es jetzt und arbeite :) wow –