2016-07-08 9 views
0

実行可能ファイルに文字列を描画し、数秒後にその文字列に別の単語を追加して繰り返します。実行可能ファイルは動作しますが、drawStringはしませんか?runnableの文字列を描画しない

誰かがコンパイルして試してみる必要がある場合は、私が望むものだけでミニアプリケーションを作った。

ここにある:

package timer.problem.example; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JFrame; 

public class TimerProblemExample extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public TimerProblemExample() { 
     setBackground(Color.black); 
     setVisible(true); 
     setTitle("Timer Problem Example"); 
     setSize(950, 600); 
     setDefaultCloseOperation(3); 
    } 

    public static void main(String[] args) { 
     new TimerProblemExample(); 
    } 

    public void timer(final Graphics graphics) { 
     new Timer().schedule(new TimerTask() { 
      int update = 6; 
      public void run() { 
       update--; 
       graphics.setFont(new Font("Splash", Font.PLAIN, 60)); 
       graphics.setColor(Color.white); 
       if (update == 5) { 
        graphics.drawString("Test", 50, 130); 
        repaint(); 
       } 

       if (update == 3) { 
        graphics.drawString("Test Test", 50, 100); 
        repaint(); 
       } 

       if (update == 1) { 
        graphics.drawString("Test Test Test", 50, 50); 
        repaint(); 
       } 
      } 
     }, 0L, 1000L); 
    } 

    @Override 
    public void paint(Graphics graphics) { 
     super.paint(graphics); 

     timer(graphics); 
    } 
} 

これを助けてください、ありがとう。

答えて

0

サンプルコードにはいくつか問題があります。

  1. repaintを呼び出すたびに、新しいタイマーが作成されます。あなたは非常に多くの実行中(そしてたいていは)、UIが更新できるよりも早く各自が最後まで再ペイントし続ける。 update--;の直前にSystem.out.println("Timer thread: "+ Thread.currentThread().getId());を追加することでこれをテストできます。さらに、フレームへの変更(例えば、マウスでドラッグしてサイズを変更する)は、paint()を呼び出すため、より多くのタイマーが生成されます。

  2. 実際には、setVisible(true);をJFrameのプロパティ(サイズ、タイトルなど)を設定するまで呼び出さないでください。今は問題ではありませんが、コンポーネントを追加する場合は問題になります。

私はあなたのコードを修正しました。これはあなたの必要に応じて機能します。

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JFrame; 

public class TimerProblemExample extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public TimerProblemExample() { 
     setBackground(Color.black); 
     setTitle("Timer Problem Example"); 
     setSize(950, 600); 
     setDefaultCloseOperation(3); 
     setVisible(true); 
     timer(getGraphics()); //call the timer from here, so there's only one running 
    } 

    public static void main(String[] args) { 
     new TimerProblemExample(); 
    } 

    public void timer(final Graphics graphics) { 
     new Timer().schedule(new TimerTask() { 
      int update = 6; 
      public void run() { 
       update--; 
       System.out.println("Timer thread: "+ Thread.currentThread().getId()); 
       graphics.setFont(new Font("Splash", Font.PLAIN, 60)); 
       graphics.setColor(Color.white); 
       if (update == 5) { 
        graphics.drawString("Test", 50, 130); 
       } 

       if (update == 3) { 
        graphics.drawString("Test Test", 50, 100); 
       } 

       if (update == 1) { 
        graphics.drawString("Test Test Test", 50, 50); 
       } 

       //Added this section to keep the update variable looping back 
       if(update<=0) 
       { 
        update = 6; 
       } 
      } 
     }, 1000L, 1000L); //0 Delay for start of timer was spawning lot's of threads in the first second. Slowed it down. Delay isn't needed anymore, but it's useful to have it to see the drawString methods being executed. 
    } 
} 

最後に、フレームに直接何も描画しないことをお勧めします。フレームにJLabelを追加し、その中にテキストを配置します。

関連する問題