4

シンプルなカウンターに取り組んでいます。私の問題は、drawString()メソッドが古い文字列の上に新しい文字列を描画することです。以前に古いものをクリアする方法は?コード...

package foobar;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class board extends JPanel implements Runnable {

    Thread animator;
    int count;

    public board() {
        this.setBackground( Color.WHITE );
        count = 0;
        animator = new Thread( this );
        animator.start();
    }

    @Override
    public void run() {
        while( true ) {
            ++count;
            repaint();
            try {
                animator.sleep( 1000 );
            } catch ( InterruptedException e ) {}
        }
    }

    @Override
    public void paint( Graphics Graphics ) {
        Graphics.drawString( Integer.toString( count ), 10, 10 );
    }
}

PS私はJavaを初めて使用するので、コードで他に修正する必要があることを教えてください...

4

4 に答える 4

7

コードのいくつかの問題:

  • Swing GUIにwhile(true)ループまたはThread.sleepを設定しないでください。代わりにスイングタイマーを使用してください。
  • ペイントメソッドではなく、JPanelのpaintComponentをオーバーライドします。
  • paintComponent(Graphics g)の最初の呼び出しはsuper.paintComponent(g)である必要があります。これにより、JPanelはハウスキーピングを実行し、古いグラフィックを取り除くことができます。

編集:

  • 私の悪いことに、あなたのwhile(true)とThread.sleep(...)バックグラウンドスレッドにあるので機能しますが、...
  • Thread.sleepは静的メソッドであり、クラス、Thread、およびで呼び出す必要があります。
  • 私はまだスイングタイマーがこれを行うためのより簡単な方法だと思います。
  • さらに簡単なのは、paintまたはpaintComponentメソッドを使用せずに、ディスプレイにJLabelのテキストを設定することです。

例えば、

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

import javax.swing.*;

public class Board2 extends JPanel {
   private static final int TIMER_DELAY = 1000;

   private int counter = 0;
   private JLabel timerLabel = new JLabel("000");

   public Board2() {
      add(timerLabel);
      new Timer(TIMER_DELAY, new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            counter++;
            timerLabel.setText(String.format("%03d", counter));
         }
      }).start();
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("Board2");
      frame.getContentPane().add(new Board2());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
于 2011-04-30T14:30:27.383 に答える
1

私はこのようにします:

public void paintComponent(Graphics g)
{
   super.paintComponent(g);
   //draw all the other stuff
}
于 2011-04-30T14:33:04.263 に答える
1

ああ!これは正常です。パネルを黒板として想像してみてください。書き込んだ内容を塗り直すたびに、最初に黒板を消去する必要があります。

Javaでも、グラフィックス全般でも、同じように動作します。ペイント方法では、次のようにします。

Graphics.clearRect(0,0, getWidth(),getHeight());
        //CLEAR the entire component first.

Graphics.drawString(...); //now that the panel is blank, draw the string.

トピックをより適切に処理できる場合は、のsuper.paint(Graphics)代わりに実行してくださいclearRect()

于 2011-04-30T14:36:21.720 に答える
1

Graphics.clearRectがあなたが探しているものだと思います。

于 2011-04-30T14:30:02.490 に答える