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,而不是它的paint 方法。
  • 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

我认为Graphics.clearRect是您正在寻找的。

于 2011-04-30T14:30:02.490 回答
1

我会这样做:

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

啊啊!这个是正常的。将您的面板想象成一个黑板。每次你想重新画你写的东西,你必须先擦黑板

在 Java 以及一般的 Graphics 中,事情以类似的方式进行。在您的绘画方法中,执行以下操作:

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 回答