2016-04-22 6 views
0

Ich habe eine Schaltfläche und wenn ich es anklicke, wird es die progressbar starten. Wenn ich einmal fertig bin, möchte ich, dass die Fortschrittsleiste zurückgesetzt wird und wenn ich erneut auf die Schaltfläche klicke, wird sie neu gestartet.
Hier ist mein Code:Wie kann ich eine JProgressBar in Java zurücksetzen?

else if (action == detectButton) { 

      // pb.setVisible(true); 

      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        pb.setValue(0); 
        pb.repaint(); 
       } 
      }); 

      for (int i = 1; i <= 10; i++) { 
       final int val = i; 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         pb.setValue(val); 
         pb.repaint(); 
         try { 
          java.lang.Thread.sleep(100); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 

       }); 

      } 

Nun ist das Problem, dass ist, wenn ich es läuft ok zuerst laufen, aber in zweiter Versuch ist es nicht die progressbar auf 0 Zurücksetzen Wie es tatsächlich tun ??

EDIT:ich die progressbar jedes Mal bin neu zu streichen, aber ich sah, dass es nicht glatt genug ist, 20 zu zeigen, dass 10% ist dann passiert% ..

+0

Was ** ** ist der zweite Versuch passiert? –

+0

Sobald der Fortschrittsbalken einmal beendet ist, dann, wenn ich es zum zweiten Mal klicke, dann bleibt der Fortschritt voll, d. H. Es wird nicht zurückgesetzt –

+0

Kannst du mehr Code zu deiner Frage hinzufügen? Sie haben eine runnable die zurückgesetzt die Fortschrittsleiste in einem eigenen Thread und wartet volle zwei Sekunden, während eine for-Schleife läuft 10 neue runnables –

Antwort

0

Ihre JProgressBar nicht zurückgesetzt, da es wird nach dem ersten Runnable neu gezeichnet. Aber deine java.lang.Thread.sleep(2000); verhindern dies. Hier

+0

Ich löschte die Zeile aber die gleiche Bedingung .. sobald die Fortschrittsleiste ist dann voll, wenn ich Klicken Sie erneut auf die Schaltfläche. Ich habe versucht, indem ich auch im Forloop schlafen(). –

0

ist ein vollständiges Beispiel, wie die progressbar zu verwenden:

public class TestWindow 
{ 

    private JFrame frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        TestWindow window = new TestWindow(); 
        window.frame.setVisible(true); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public TestWindow() 
    { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() 
    { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     final JProgressBar progressBar = new JProgressBar(); 
     progressBar.setBounds(10, 11, 414, 14); 
     frame.getContentPane().add(progressBar); 

     JButton btnNewButton = new JButton("Reset"); 
     btnNewButton.setBounds(10, 228, 89, 23); 
     frame.getContentPane().add(btnNewButton); 

     JButton button = new JButton("Run"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Runnable update = new Runnable() 
       { 

        @Override 
        public void run() 
        { 
         for (int i = 1; i <= 100; i++) 
         { 
          final int val = i; 

          SwingUtilities.invokeLater(new Runnable() 
          { 
           public void run() 
           { 
            progressBar.setValue(val); 
            progressBar.repaint(); 
           } 

          }); 

          try 
          { 
           java.lang.Thread.sleep(100); 
          } 
          catch (InterruptedException e1) 
          { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } 
         } 
        } 
       }; 
       Thread t = new Thread(update); 
       t.start(); 
      } 
     }); 

     button.setBounds(109, 228, 89, 23); 
     frame.getContentPane().add(button); 

     btnNewButton.addActionListener(new ActionListener() 
     { 

      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       SwingUtilities.invokeLater(new Runnable() 
       { 

        @Override 
        public void run() 
        { 
         progressBar.setValue(0); 
         progressBar.repaint(); 
        } 
       }); 
      } 
     }); 

    } 
} 
+0

also muss ich zwei Tasten verwenden, um es zu starten und es zurückzusetzen. Kann ich es nicht in einem Knopf drücken ?? oder einfach die Fortschrittsleiste ausblenden, wenn sie beendet ist und die Taste beim Starten wieder vom Anfangszustand aus zeigt ?? –

Verwandte Themen