Repaint () не очищает кадр - PullRequest
       0

Repaint () не очищает кадр

3 голосов
/ 05 февраля 2011
public class Graphics2DTest extends JPanel implements ActionListener{
private Timer time = new Timer(5,(ActionListener) this);
int x = 0,y = 0;
public void paintComponent(Graphics g){

    Graphics2D gui = (Graphics2D) g;
    Rectangle2D rectangle = new Rectangle2D.Double(x,y,100,150);
    gui.setPaint(Color.GREEN);
    gui.fill(rectangle);
    time.start();
}

public void actionPerformed(ActionEvent arg0) {
    x++;
    y++;
    repaint();
}
}

Проблема в том, что repaint () должен очистить рамку и нарисовать прямоугольник в позиции, но ранее нарисованный прямоугольник остается.Итак, как это сделать?Пожалуйста, объясните ваши ответы.

Ответы [ 3 ]

14 голосов
/ 05 февраля 2011

Вы пытались вызвать super.paintComponent (g) в своем методе paintComponent?Это очистит предыдущие изображения, нарисованные в вашем JPanel:

public void paintComponent(Graphics g){
  super.paintComponent(g);
  Graphics2D gui = (Graphics2D) g;
  Rectangle2D rectangle = new Rectangle2D.Double(x,y,100,150);
  gui.setPaint(Color.GREEN);
  gui.fill(rectangle);
  //time.start();
}

Кроме того, не запускайте таймер и не выполняйте программную логику в методе paintComponent.Во-первых, вы не можете абсолютно контролировать, когда или будет вызван метод, и, во-вторых, этот метод должен касаться только рисования и ничего больше, и должен быть максимально быстрым.

Например:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

import javax.swing.*;

public class Graphics2DTest extends JPanel implements ActionListener {
    private Timer time = new Timer(5, (ActionListener) this);
    int x = 0, y = 0;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D gui = (Graphics2D) g;
        Rectangle2D rectangle = new Rectangle2D.Double(x, y, 100, 150);
        gui.setPaint(Color.GREEN);
        gui.fill(rectangle);
        //time.start();
    }

    public void actionPerformed(ActionEvent arg0) {
        x++;
        y++;
        repaint();
    }

    public Graphics2DTest() {
        setPreferredSize(new Dimension(700, 500));
        time.start();
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("Graphics2DTest");
        frame.getContentPane().add(new Graphics2DTest());
        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 голос
/ 05 февраля 2011

Сначала необходимо очистить фон.

Ресурс:

http://java.sun.com/products/jfc/tsc/articles/painting/

1 голос
/ 05 февраля 2011

Вам также необходимо перекрашивать фон каждый раз. Добавьте код, чтобы нарисовать фон, прежде чем рисовать прямоугольник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...