簡體   English   中英

GIF ImageIcon在Java Swing中不斷閃爍

[英]GIF ImageIcon keeps flickering in Java Swing

我必須在學校用Java Swing做一個小游戲。 我為此創建了一些gif文件,並希望將它們放進去,但是確實這樣做了,但問題是gif有時會閃爍。 我真的無法在Internet上找到任何東西,說實話,我什至不知道從哪里開始准確查找。

我的代碼:

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());
    }
}

代碼有問題嗎? 還是有其他方法可以做到,而我做錯了嗎? gif應該很好,我自己創建了它們,當我從PC上查看它們時,它們看起來還不錯。

曲奇餅

編輯

發現當我取出曲奇時,雞肉沒有閃爍,但我不知道為什么。

刪除setDoubleBuffered(true); 來自paintComponent 可能是誘惑代碼。 您可以在構造函數中調用它,但是默認情況下雙緩沖處於打開狀態。 移動setBackground(Color.BLACK); 到構造函數。

然后刪除update方法。

您通常不需要調用 super.paintComponent(); 將其注釋掉,然后嘗試進行更改。

您可能需要setContentPane(canvas)

如果仍然存在問題,那是由於gif處理的內部工作原理所致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM