Graphics.drawString() Рисует поверх моей старой строки

#java #graphics #awt #drawstring

#java #графика #awt #drawstring

Вопрос:

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

P.S. Я новичок в Java, поэтому, пожалуйста, не бойтесь сказать мне, какие еще вещи я должен исправить в своем коде…

Комментарии:

1. Пытаюсь Java! Хороший выбор 😉 А пока наберитесь терпения. Позже все станет (очень) проще.

Ответ №1:

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

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

Редактировать:

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

Ответ №2:

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

Комментарии:

1. Кит, ты придурок! Это не JComponent, а JPanel. Нет, это супер метод, и он должен быть в paintComponent. Надеюсь, у вас и ваших друзей все идет хорошо. С уважением, Пит

2. @Судно на воздушной подушке, полное угрей: Я согласен с этим. Тем не менее, это хорошая практика для clearRect первых шагов, чтобы понять , как все работает.

3. @jmendeth: Я не уверен. Это необходимо при создании графики в JComponent, но JPanel сделает это за вас, если вы вызовете метод super, и поэтому я думаю, что лучше всего использовать соответствующий ситуации инструмент. Но я также просто доставлял Киту неприятности, так как не видел его целую вечность (со времен моего старого форума Sun).

4. @HFOE: Привет!!! Давно не видел! Как ни странно, я действительно очень хочу одну из этих . И да, я ВСЕ ЕЩЕ придурок, и мне все еще нужно научиться действительно ЧИТАТЬ вопросы (внимательно)… В мою защиту: AWT — это чистая грязь! (ИМХО), и я купил себе одну из этих (BF MkII)… Ее зовут Бетти, она черная, и она КУСАЕТСЯ!

5. Круто! Сам я хотел бы получить Aston Martin DB6 Volante, как принц Уильям, но моя жена Диана говорит, что это либо машина, либо она. Я обязательно буду скучать по Диане.

Ответ №3:

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

 public void paintComponent(Graphics g)
{
   super.paintComponent(g);
   //draw all the other stuff
}
  

Ответ №4:

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

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