繁体   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