#java #image #timer #hide
#java #изображение #таймер #скрыть
Вопрос:
Я пытаюсь создать простую программу, которая показывает, что позволяет изображению перемещаться по экрану. Теперь iv’e удалось создать изображение для перехода слева направо, но теперь у меня на экране около 20 изображений.
Что мне нужно получить, так это то, что при печати следующего изображения предыдущее изображение будет скрыто. Также, если бы кто-нибудь мог помочь мне с печатью с помощью таймера, это было бы здорово.
Вот мой код
package imagemove;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class imagemove extends Component {
private int x;
private int y;
BufferedImage img;
public imagemove() {
try {
img = ImageIO.read(new File("F:/JAVA/workspace/Tutorials/src/imagemove/1.jpg"));
} catch (IOException e) {
}
}
public void paint(Graphics g) {
x = 0;
y = 50;
for (int number = 1; number <= 15; number ) {
g.drawImage(img, x, y, this);
if (x > 1000) {
x = 0;
} else {
x = 100;
}
if(y > 100) {
y -= 100;
} else {
y = 25;
}
repaint();
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Boot");
f.setSize(1000,1000);
f.add(new imagemove());
f.setVisible(true);
}
}
Ответ №1:
- вы должны поместить свой цикл for в другой метод, который вызывается из метода main . (очевидно, что инструкция рисования изображения должна оставаться в методе рисования)
- используйте paintComponent вместо paint
- поместите super.paintComponent(g) в качестве первой строки в paintComponent(). и ваши предыдущие изображения должны быть очищены
Редактировать:
расширить JComponent вместо Component . Компонент — AWT, JComponent — Swing
Ответ №2:
Это работает таким образом; он протестировал это:
public class imagemove extends Component {
private int x;
private int y;
BufferedImage img;
public imagemove() {
try {
img = ImageIO.read(new File("F:/JAVA/workspace/Tutorials/src/imagemove/1.jpg"));
} catch (IOException e) {
}
x = 0;
y = 50;
}
@Override
public void paint(Graphics g) {
g.drawImage(img, x, y, this);
if (x > 1000) {
x = 0;
} else {
x = 100;
}
if(y > 100) {
y -= 100;
} else {
y = 25;
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Boot");
f.setSize(1000,1000);
f.add(new imagemove());
f.setVisible(true);
for (int number = 1; number <= 15; number ) {
f.repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
}
Комментарии:
1. зачем
this
быть ImageObserver для BufferedImage?2. paint() не должен изменять состояние компонента. Обновление x и y должно выполняться в другом месте
Ответ №3:
Вы не можете вызвать repaint из метода paint().