所以,你遇到的第一個問題是資源問題。
存儲在應用程序中的資源(通常稱爲嵌入式資源)無法像外部資源一樣加載。
chick[0] = tk.createImage("stand.png");
期待一個文件"./stand.png"
不存在。相反,你需要通過Class#getResource
API調用的資源...
chick[0] = tk.createImage(getClass().getResource("/stand.png"));
將要面臨的第二個問題是,你是壓倒一切的頂層容器paint
的事實。這真的不應該這樣做。讓我們從它沒有雙重緩衝的事實開始,並以框架具有位於可視區域內的裝飾物的事實結束。這意味着裝飾將重疊你所繪製的任何表面......不太漂亮......
第三個問題是你沒有告訴圖像它應該移動到哪裏。它是靜態的。
您需要某種x/y值來告訴圖像應該在哪裏繪製。您可以在您調用repaint
之前,通過給定的x/y增量修改這些值...
您可能遇到的第四個問題是您正在使用AWT ...這是一種過時的事實。 Swing會爲你解決你的雙緩衝問題...恕我直言,會做出更好的選擇 - 有更多的文檔和Swing現在鋪設在現在的日子上的例子;
雖然我在我的跛足馬...我個人而言,建議在ImageIO
或Toolkit#createImage
ImageIcon
,主要是因爲它支持更多的格式,而且還因爲它會拋出一個Exception
時不能讀取由於某種原因,圖像...
我有一個簡單的例子如果是Swing,但我不會發布,因爲我會因爲主題的運行而陷入困境...讓我知道你是否想看到它
更新與Swing例如
這將使用默認的包中嵌入了圖像...
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ChickenDance {
public static void main(String[] args) {
new ChickenDance();
}
public ChickenDance() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private BufferedImage chicken;
private int xPos;
private int yPos;
private int xDelta = 4;
public TestPane() {
try {
chicken = ImageIO.read(getClass().getResource("/Chicken.png"));
} catch (IOException ex) {
Logger.getLogger(ChickenDance.class.getName()).log(Level.SEVERE, null, ex);
}
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
xPos += xDelta;
if (xPos + chicken.getWidth() > getWidth()) {
xPos = getWidth() - chicken.getWidth();
xDelta *= -1;
} else if (xPos < 0) {
xPos = 0;
xDelta *= -1;
}
yPos = (getHeight() - chicken.getHeight())/2;
repaint();
}
});
if (chicken != null) {
timer.start();
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (chicken != null) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(chicken, xPos, yPos, this);
g2d.dispose();
}
}
}
}
雖然有你們的做法一些明顯的問題,你有什麼特別的問題? – MadProgrammer
那麼,對於初學者,我打算在我的applet上顯示第一個圖像,但我的applet似乎沒有顯示任何圖像。 – ghost
我假設你知道你沒有顯示小程序的代碼... – MadProgrammer