首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Graphics.drawString()覆盖我的旧字符串

Graphics.drawString()覆盖我的旧字符串
EN

Stack Overflow用户
提问于 2011-04-30 22:24:24
回答 4查看 16.1K关注 0票数 4

我在做简单的计数器。我的问题是drawString()方法在旧字符串上绘制新字符串。如何清除之前的旧版本?代码...

代码语言:javascript
运行
复制
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 );
    }
}

附注:我是Java新手,所以请不要害怕告诉我我应该在我的代码中修复什么其他东西……

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-30 22:30:27

代码中有几个问题:

  • 在Swing图形用户界面中没有while (true)循环或Thread.sleep。使用Swing Timer instead.
  • Override JPanel的paintComponent,而不是它的paint方法。
  • 在paintComponent(图形g)中的第一个调用应该是super.paintComponent(g),这样你的JPanel就可以做好自己的工作,摆脱旧的图形。

编辑:

我的错,你的while (true)和Thread.sleep(...) 工作,因为它们在后台线程中,但是,...

  • Thread.sleep是一个静态方法,应该在类、线程和

  • 上调用。我仍然认为使用Swing计时器会更简单。

  • 更简单的方法是甚至不使用paint或paintComponent方法,而是简单地为显示设置JLabel的文本。

<>F219

例如,

代码语言:javascript
运行
复制
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();
         }
      });
   }
}
票数 7
EN

Stack Overflow用户

发布于 2011-04-30 22:30:02

我想Graphics.clearRect就是你要找的人。

票数 1
EN

Stack Overflow用户

发布于 2011-04-30 22:33:04

我会这样做:

代码语言:javascript
运行
复制
public void paintComponent(Graphics g)
{
   super.paintComponent(g);
   //draw all the other stuff
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5842360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档