簡體   English   中英

如何顯示數組中的圖像?

[英]How do I display images from an array?

如何修復它以顯示圖像? 我正在使用 NetBeans 11.2 Java Gradle 我正在嘗試制作汽車的圖像 Z34D1F91FB12E514B8A6576 JPanel彈出,但沒有顯示圖像。 我已經做了很長時間試圖弄清楚這一點。 沒有錯誤信息出現。

import javax.swing.*;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;

public class Main extends JPanel implements ActionListener {
    private final Timer animate;
    private final ImageIcon ImageArray[];
    private int delay = 50, FrameCount = 200, Currentframe = 0;

    public Main() {
        ImageArray = new ImageIcon[FrameCount];
        for (int i = 1; i < ImageArray.length; i++) {
            ImageArray[i] = new ImageIcon(getClass().getResource("Cartest (" + i + ").jpg"));
        }
        animate = new Timer(delay, this);
        animate.start();
    }

    public void paintConponent(Graphics g) {
        super.paintComponent(g);
        if (Currentframe >= ImageArray.length) {
            Currentframe = 0;
        }
        Currentframe++;
        ImageArray[Currentframe].paintIcon(this, g, 0, 0);
    }

    public void actionPerformed (ActionEvent e) {
        repaint();
    }

    public static void main (String args[]) {
        JFrame f= new JFrame("hello");
        Main s = new Main();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400,400);
    }
}

正如其他人指出的那樣,您在paintComponent方法的名稱中打錯了字。 第二個問題是你會得到一個NullpointerException由於 line currentFrame = 0; (在第一次迭代之后)當您開始從索引 1 填充 imageArray 時。代碼的getResource部分沒有任何問題,因為如果找不到圖像,它會在該行引發異常。

建議:重寫超類的方法時使用Override注釋。 如果您打錯了,編譯器將開始抱怨注釋的不正確使用。

這個答案不一定表明如何做事。 但它確實使您的代碼工作:

import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;

public class Main extends JPanel implements ActionListener {

    private final Timer animate;
    private final ImageIcon imageArray[];
    private int delay = 50, frameCount = 200, currentFrame = 0;

    public Main() {

        imageArray = new ImageIcon[frameCount];


        for (int i = 1; i < imageArray.length; i++) {

            imageArray[i] = new ImageIcon(getClass().getResource("Cartest (" + i + ").jpg"));

        }

        animate = new Timer(delay, this);
        animate.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        currentFrame++;
        if (currentFrame == imageArray.length) {
            currentFrame = 1;
        }

        imageArray[currentFrame].paintIcon(this, g, 0, 0);
    }

    public static void main (String args[]) {
        JFrame f= new JFrame("hello");
        Main s = new Main();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400,400);
    }

}

這是為汽車圖像設置動畫的一種方式。 OP 沒有提供汽車圖像,所以我創建了一個。

汽車形象

這是我創建的 GUI。 汽車從右向左移動。

汽車動畫圖形用戶界面

當我創建 Swing 應用程序時,我使用model / view / controller模式。 這個 model 強制分離關注點,並允許我一次專注於 Swing 應用程序的一部分。

所以,我做的第一件事就是創建Car class。 Car class 擁有圖像的 position 和圖像本身。

通常,在 Swing 應用程序中,您首先閱讀所有資源,然后創建您的 GUI。 如果讀取資源需要很長時間,您可以在構建 GUI 時運行的單獨線程中讀取資源。

因為我有一個資源,所以我讀了它。

創建Car class 后,我創建了一個視圖,其中包含一個JFrame和一個繪圖JPanel 通常,您創建一個繪圖JPanel並在該繪圖JPanel上繪制所有內容。

本應用中的 controller 是 Swing Timer Timer將汽車從右向左移動,並在汽車到達繪圖JPanel的左邊緣時重新開始。

這是完整的可運行代碼。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class CarAnimationGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new CarAnimationGUI());
    }
    
    private int drawingAreaWidth;
    private int drawingAreaHeight;
    private int startX, startY;
    
    private Car car;
    
    private DrawingPanel drawingPanel;
    
    public CarAnimationGUI() {
        this.drawingAreaWidth = 600;
        this.drawingAreaHeight = 200;
        this.car = new Car();
        
        BufferedImage image = car.getImage();
        this.startX = drawingAreaWidth - image.getWidth();
        this.startY = drawingAreaHeight - image.getHeight();
        car.setLocation(new Point(startX, startY));
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Car Animation GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        this.drawingPanel = new DrawingPanel(drawingAreaWidth, 
                drawingAreaHeight);
        frame.add(drawingPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        
        Timer animate = new Timer(50, new CarMover(startX, startY));
        animate.start();
    }
    
    public void repaint() {
        drawingPanel.repaint();
    }
    
    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        
        public DrawingPanel(int width, int height) {
            this.setBackground(new Color(154, 232, 208));
            this.setPreferredSize(new Dimension(width, height));
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            BufferedImage image = car.getImage();
            Point point = car.getLocation();
            
            g.drawImage(image, point.x, point.y, this);
        }
        
    }
    
    private class CarMover implements ActionListener {

        private final int startX, startY;
        private int x;
        
        public CarMover(int startX, int startY) {
            this.startX = startX;
            this.startY = startY;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            x -= 3;
            x = (x < 0) ? startX : x;
            car.setLocation(new Point(x, startY));
            repaint();
        }
        
    }
    
    public class Car {
        
        private final BufferedImage image;
        
        private Point location;

        public Car() {
            this.image = setImage();
        }
        
        private BufferedImage setImage() {
            try {
                return ImageIO.read(getClass()
                        .getResourceAsStream("/car.jpg"));
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

        public BufferedImage getImage() {
            return image;
        }

        public void setLocation(Point location) {
            this.location = location;
        }

        public Point getLocation() {
            return location;
        }
        
    }

}

暫無
暫無

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

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