GIF ImageIcon продолжает мерцать в Java Swing - PullRequest
0 голосов
/ 24 мая 2018

Я должен сделать небольшую игру на Java Swing для школы.Я создал несколько картинок для этого и хотел вставить их, и я сделал, но проблема в том, что картинки иногда мерцают.Я действительно не могу ничего найти в Интернете, и, честно говоря, я даже не знаю, с чего начать искать.

Мой код:

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class Chicken extends JFrame {

    private int canvasWidth = 560;
    private int canvasHeight = 480;

    private Color sideGreen = new Color(14, 37, 14);
    private Color gapGreen = new Color(56, 148, 56);
    private Color edgeGreen = new Color(49, 129, 49);

    private Image chicken;
    private Image cookie;

    private DrawCanvas canvas;

    public Chicken() {
        canvas = new DrawCanvas();

        canvas.setPreferredSize(new Dimension(canvasWidth, canvasHeight));

        try {
            addImages();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        Container cp = getContentPane();
        cp.add(canvas);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setTitle("Chicken");
        pack();
        setVisible(true);
    }

    private class DrawCanvas extends JPanel {

        @Override
        public void update(Graphics g) {
            paintComponent(g);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            setDoubleBuffered(true);
            setBackground(Color.BLACK);
            g2.setColor(sideGreen);
            g2.fillRect(0, 0, 80, canvasHeight);
            g2.fillRect(canvasWidth - 80, 0, 80, 480);
            g2.setColor(gapGreen);
            g2.fillRect(80, 0, 400, 100);
            g2.fillRect(80, canvasHeight - 100, 400, 100);
            g2.setColor(edgeGreen);
            g2.fillRect(80, 80, 400, 20);
            g2.fillRect(80, canvasHeight - 100, 400, 20);
            g2.drawImage(cookie, 85, 5, this);
            g2.drawImage(chicken, 150, 120, this);
        }
    }

    private void addImages() throws Exception {
        ImageIcon iconCookie = new ImageIcon(new URL("https://i.stack.imgur.com/1PcWC.gif"));
        Image cookieimage = iconCookie.getImage();
        Image newimg = cookieimage.getScaledInstance(70, 70, Image.SCALE_DEFAULT);
        iconCookie = new ImageIcon(newimg);

        ImageIcon iconChicken = new ImageIcon(new URL("https://i.stack.imgur.com/qJA7G.gif"));
        Image chickenimage = iconChicken.getImage();
        Image newimgc = chickenimage.getScaledInstance(250, 250, Image.SCALE_DEFAULT);
        iconChicken = new ImageIcon(newimgc);

        chicken = iconChicken.getImage();
        cookie = iconCookie.getImage();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Chicken());
    }
}

Что-то не так в коде?Или есть другой способ сделать это, и я просто сделал это неправильно?Гифки должны быть в порядке, я создал их сам, и они выглядят отлично, когда я смотрю их с компьютера.

Цыпленок

image

Cookie

image

Edit

Обнаружено, что курица не мерцает, когда я удаляю печенье, но я нене знаю почему.

1 Ответ

0 голосов
/ 24 мая 2018

Удалить setDoubleBuffered(true); из paintComponent.Вероятно, соблазнительный код.Вы можете вызвать это в конструкторе, но по умолчанию двойная буферизация включена.Переместите setBackground(Color.BLACK); в конструктор.

Затем удалите метод update.

Обычно вам не нужно вызывать super.paintComponent();.Прокомментируйте это и попробуйте увидеть изменения.

Вы можете сделать setContentPane(canvas).

Если проблема все еще существует, то это из-за внутренней работы с GIF-файлами.

...