Итак, первая проблема, с которой вы столкнулись, - проблема с ресурсами.
Ресурсы, хранящиеся «внутри» приложения (обычно называемые встроенными ресурсами), не могут быть загружены как внешние ресурсы.
chick[0] = tk.createImage("stand.png");
ожидает файл "./stand.png"
, который не существует. Вместо этого вам нужно загрузить ресурс через Class#getResource
API ...
chick[0] = tk.createImage(getClass().getResource("/stand.png"));
Вторая проблема, вы столкнетесь является тот факт, что вы перекрывая paint
контейнера верхнего уровня. Это действительно не должно быть сделано. Начнем с того, что это не двойное буферирование и заканчивается тем фактом, что в кадрах есть декорации, которые находятся внутри видимой области. Это означает, что украшения будут перекрывать то, что когда-либо вы рисуете на поверхности ... не очень ...
Третья проблема заключается в том, что вы не указываете изображение, куда оно должно двигаться. Это статично.
Вам нужно какое-то значение x/y, которое сообщает изображению, где оно должно быть нарисовано. Вы изменили бы эти значения на заданную x/y-дельта внутри вашего потока до того, как вы позвонили repaint
...
Четвертая проблема, которая может возникнуть, заключается в том, что вы используете AWT ... который отчасти устарел. Swing решит вашу проблему с двойной буферизацией для вас ... ИМХО, сделало бы лучший выбор - есть много больше документации и примеров в Swing, которые укладываются в наши дни;)
Пока я нахожусь на моем хворостаном коне ... Я, лично, рекомендую ImageIO
над Toolkit#createImage
или ImageIcon
, в основном потому, что она поддерживает больше форматов, но и потому, что он будет бросать Exception
, когда изображение не может быть прочитан по какой-то причине ...
у меня есть простой пример если 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
Ну, для начинающих я намерен отображать первое изображение на своем апплете, но мой апплет, похоже, не показывает никакого изображения. – ghost
Я предполагаю, что вы знаете, что вы не указали код для апплета ... – MadProgrammer