2016-03-24 6 views
0

fillrect()、drawrect()、およびthread.sleep()によってプログレスバーが作成されています。問題は、プログラムを閉じたり、フレームのサイズを変更するときに、プログレスバーが停止してプログラムが応答しないことです。私はJPregressBar()を使わずにこの進捗バーを行う別の方法を探していますが、私が閉じるとフレームが閉じます。
これはコードです:プログラムを閉じるときに応答しない

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、ヘッドアップのおかげで。私は私のコメントを削除するつもりです! – Floam

+0

私はこの質問者にとって役に立つリンクを見つけました:http://www.nurkiewicz.com/2014/05/interruptedexception-and-interrupting.html – Floam

+0

イベントで 'Thread.sleep'を呼び出すべきではありませんディスパッチスレッド( 'paint'メソッド内)また、現在オーバーライドしているペインティングの動作を許可するには、 'super.paint(g)'を呼び出す必要があります。最後に、ウィンドウではなく、 'paintComponent'を使って' JPanel'を使ってペインティングする必要があります。私は[The Java Tutorial - Custom Painting](https://docs.oracle.com/javase/tutorial/uiswing/painting/)をチェックすることをお勧めします。 –

答えて

0

問題は、あなたがEventdispatchingスレッドで寝ていること、です。

新しいスレッドで作業する必要があります。

セカンド問題。あなたはpaintからsuperMethodを呼び出す必要があります。

いつでも再描画します。

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

ありがとうございました。今私はプログラムを閉じることができますが、再描画がうまくいかず、プログレスバーが表示されません。良い塗り替えをするにはどうすればいいですか? –