super.paintComponent () не работает должным образом - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь нарисовать фигуру несколько раз внутри JPanel, чтобы имитировать анимацию (движущуюся фигуру по ней).Проблема в том, что форма перерисовывается и, таким образом, появляется на экране несколько раз в разных местах, когда все, что я делаю вид, это то, что только одна форма видна в то время, когда она перерисовывается.

Метод super.paintComponent () должен отвечать за перерисовку фона JPanel, и поэтому при перерисовке должна быть видна только одна фигура.

У меня есть следующий код ( он был уменьшен / упрощен радипростоты и лучшего понимания ):

public class Animated_Shape_Test extends JFrame
{
    public static void main(String args[]) throws IOException 
    {
        new Animated_Shape_Test();
    }

    public Animated_Shape_Test() throws IOException
    {
        this.setSize(500, 500);
        this.setPreferredSize(new Dimension(500, 500));
        this.setLocation(new Point(430, 150));
        this.setTitle("Database Launcher v1.0");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);

        DBPanel panel = new DBPanel();

        getContentPane().add(panel, BorderLayout.CENTER);
    }
}

final class DBPanel extends JPanel implements Runnable
{   
    int musicShapePosX = 85;
    int musicShapePosY = 100;
    int SEGMENT_SHAPE_LENGTH = 50;
    int SHAPE_HEIGHT = 10;
    float SHAPE_SPEED = 7.5f; 

    CustomShapeButton musicShapeButton = new CustomShapeButton(musicShapePosX, musicShapePosY, SEGMENT_SHAPE_LENGTH, SHAPE_HEIGHT);

    private ArrayList<Shape> shapes = null;

    protected DBPanel() throws IOException
    {   
        shapes = new ArrayList();

        shapes.add(musicShapeButton);

        this.setOpaque(true);
        this.setFocusable(true);

        startThread();
    }

    public void startThread()
    {
        Thread t = new Thread(this);

        t.start();
    }

    @Override
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(getBackground().darker());
        g2.fillRect(0, 0, getWidth(), getHeight());

        g2.setColor(Color.BLACK);
        g2.draw(musicShapeButton);
    }

    public void delay(int milliseconds)
    {
        try
        {
            Thread.sleep(milliseconds);
        } 
        catch (InterruptedException e)
        {
        }
    }

    @Override
    public void run() 
    {
        while (true)
        {
            delay(35);
            animateButtonShapeMusic();
            repaint();
        }
    }

    public void animateButtonShapeMusic()
    {
        if (musicShapePosY < 228)
        {
            musicShapePosY = (int)(musicShapePosY + SHAPE_SPEED);    

            musicShapeButton.drawShape(musicShapePosX, musicShapePosY, SEGMENT_SHAPE_LENGTH, SHAPE_HEIGHT);
        }
    }
}

Я получаю несколько фигур, перерисовываемых по экрану (анимация).Я ожидаю, что одна фигура перерисовывается по экрану (анимация).

Заранее спасибо.

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