[英]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.