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