2016-03-24 8 views
0

Ich habe einen Fortschrittsbalken von fillrect(), drewrect() und thread.sleep() gemacht. Das Problem ist, dass, wenn ich das Programm schließen oder die Größe des Rahmens ändern möchte, der Fortschrittsbalken anhält und das Programm nicht reagiert. Ich suche nach einer alternativen Möglichkeit, diesen Fortschrittsbalken zu erstellen, ohne die JRegressBar() zu verwenden, und wenn ich drücke, wird der Rahmen geschlossen.
Dies ist der Code:Nicht zu beantworten, wenn Sie das Programm schließen

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.*; 

import javax.swing.*; 

public class Main extends JFrame{ 

private int num1, num2, width=0, g1; 

public Main(){ 
    this.setTitle("Progressbar with rectangles"); 
    this.setSize(500, 500); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setVisible(true); 
    this.setResizable(true); 
} 
public void paint(Graphics g){ 
    g.setColor(Color.RED); 
    g.drawRect(40, 40, 300, 20); 

    g.setColor(Color.BLACK); 

    for(width=0; width<300; width++){ 
     g.fillRect(40,40,width,20); 
     try { 
      Thread.sleep(50); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
} 
} 



public static void main(String[]args){ 
    Main m=new Main(); 
} 
} 
+0

@ Vogel612, danke für die Köpfe hoch. Ich werde meinen Kommentar entfernen! – Floam

+0

Ich habe diesen Link gefunden, der dem Fragesteller nützlich sein könnte: http://www.nurkiewicz.com/2014/05/interruptedexception-and-interrupting.html – Floam

+0

Sie sollten 'Thread.sleep' nicht auf dem Event aufrufen Dispatch Thread (in der 'paint' Methode). Sie sollten auch 'super.paint (g)' aufrufen, damit das Malverhalten, das Sie gerade überschreiben, ausgeführt werden kann. Zuletzt sollten Sie über 'JPanel' mit' paintComponent' malen, kein Fenster. Ich empfehle das [Java Tutorial - Benutzerdefinierte Malerei] (https://docs.oracle.com/javase/tutorial/uiswing/painting/) –

Antwort

0

Das Problem ist, dass Sie in dem Eventdispatching Thema schlafen.

Sie müssen Ihre Arbeit in einem neuen Thread erledigen.

Das zweite Problem. Sie sollten die SuperMethod von Farbe aufrufen.

Und jedes Mal, wenn Sie neu streichen möchten. Rufen Sie repaint() :)

private int num1, num2, width = 0, g1; 

public Main() { 
    this.setTitle("Progressbar with rectangles"); 
    this.setSize(500, 500); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setVisible(true); 
    this.setResizable(true); 

    Main main = this; 

    Thread t = new Thread(new Runnable() { 
     public void run() { 

      for(width=0; width<300; width++) { 

       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 

         main.repaint(); 
        } 
       }); 


       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    }); 

    t.start(); 
} 

@Override 
public void paint(Graphics g) { 

    super.paint(g); 

    g.setColor(Color.RED); 
    g.drawRect(40, 40, 300, 20); 

    g.setColor(Color.BLACK); 

    g.fillRect(40, 40, width, 20); 

} 

public static void main(String[] args) { 
    Main m = new Main(); 
} 
+0

Vielen Dank. Jetzt kann ich das Programm schließen, aber das Repaint funktioniert nicht gut, wir können den Fortschrittsbalken nicht sehen. Wie kann ich ein gutes Repaint machen? –