Graphics.drawString () рисует поверх моей старой строки - PullRequest
4 голосов
/ 30 апреля 2011

Я работаю над простым счетчиком.Моя проблема в том, что метод 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 ]

7 голосов
/ 30 апреля 2011

Несколько проблем в вашем коде:

  • Не имеет цикла while (true) или Thread.sleep в графическом интерфейсе Swing. Вместо этого используйте Swing Timer.
  • Переопределить элемент рисования JPanel, а не метод рисования.
  • Первый вызов в paintComponent (Graphics g) должен быть super.paintComponent (g), чтобы ваш JPanel мог вести свою работу и избавиться от старой графики.

редактирование:

  • Боже мой, ваши while (true) и Thread.sleep (...) будут работать, так как они в фоновом потоке, но, ...
  • Thread.sleep является статическим методом и должен вызываться для класса, Thread и
  • Я все еще думаю, что Swing Timer был бы более простым способом сделать это.
  • Еще проще - даже не использовать метод 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();
         }
      });
   }
}
1 голос
/ 30 апреля 2011

Ааа! Это нормально. Представьте, что ваша панель - доска . Каждый раз, когда вы хотите перекрасить то, что написали, вам придется сначала стереть доску .

В 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().

1 голос
/ 30 апреля 2011

Я бы сделал это так:

public void paintComponent(Graphics g)
{
   super.paintComponent(g);
   //draw all the other stuff
}
1 голос
/ 30 апреля 2011

Я думаю Graphics.clearRect - это то, что вы ищете.

...