我想遍历图像的数组列表
I want to iterate through an arraylist of Images
我有一个图像数组列表,我试图让每个图像在屏幕上重复滑动..
public class GraphicsT extends JPanel implements ActionListener {
Timer timer = new Timer(1, this);
Image image;
Image image2;
int x1;
int x2;
int y1;
int y2;
int num;
List<String> imageList1 = new ArrayList<String>();
GraphicsT() {
imageList1.add("image/java.jpeg");
imageList1.add("image/slide.jpg");
imageList1.add("image/giphy.gif");
x1 = 100;
y1 = 100;
x2 = 200;
y2 = 200;
num = 0;
}
public void paint(Graphics g) {
ImageIcon i2 = new ImageIcon("image/street.jpg");
image2 = i2.getImage();
g.drawImage(image2, 0, 0, null);
for (int i = 1; i < imageList1.size(); i++) {
ImageIcon im = new ImageIcon(imageList1.get(i));
image = im.getImage();
g.drawImage(image, x1, y1, x2, y2, 100, 120, 120, 240, null);
System.out.println(imageList1.get(i));
}
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
num++;
if (num % 100 == 0) {
x1 = x1 + 10;
x2 = x2 + 10;
}
if (x2 >= 570) {
// end reached
x1 = 0;
x2 = 100;
}
repaint();
}
}
public class GraphicsApp extends JFrame {
GraphicsT gt = new GraphicsT();
public GraphicsApp() {
this.setTitle("Multiple Slide");
this.setSize(450, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.add(gt);
}
public static void main(String[] args) {
new GraphicsApp();
}
}
我目前的代码只能选择一张图片,但我想要这样一种情况,即在第一张图片离开屏幕后,第二张图片可以跟随,然后是第三张,依此类推...
非常感谢您的帮助。
几个问题:
您应该重写 paintComponent()
而不是 paint() 并调用 super.paintComponent(...) 以确保首先绘制背景。
一种画法,仅作画法。你不应该做 I/O 来阅读图像。这些图像应该在 class
的构造函数中读取
你不应该在绘画方法中启动定时器。定时器在构造函数中启动。
你的基础绘画代码有误。你应该有几个实例变量,a) "currentImage", b) "imageNumber"。然后在绘画方法中,您只需在 x/y 位置绘制 currentImage 即可。
在 ActionListener 中,当图像离开屏幕时,您递增 "imageNumber" 并将图像从 ArrayList 复制到 "currentImage"。然后重置 x/y 位置,以便从右侧开始绘制图像。
当 "imageNumber" 到达 ArrayList 的末尾时,您将其重置为 0。
我有一个图像数组列表,我试图让每个图像在屏幕上重复滑动..
public class GraphicsT extends JPanel implements ActionListener {
Timer timer = new Timer(1, this);
Image image;
Image image2;
int x1;
int x2;
int y1;
int y2;
int num;
List<String> imageList1 = new ArrayList<String>();
GraphicsT() {
imageList1.add("image/java.jpeg");
imageList1.add("image/slide.jpg");
imageList1.add("image/giphy.gif");
x1 = 100;
y1 = 100;
x2 = 200;
y2 = 200;
num = 0;
}
public void paint(Graphics g) {
ImageIcon i2 = new ImageIcon("image/street.jpg");
image2 = i2.getImage();
g.drawImage(image2, 0, 0, null);
for (int i = 1; i < imageList1.size(); i++) {
ImageIcon im = new ImageIcon(imageList1.get(i));
image = im.getImage();
g.drawImage(image, x1, y1, x2, y2, 100, 120, 120, 240, null);
System.out.println(imageList1.get(i));
}
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
num++;
if (num % 100 == 0) {
x1 = x1 + 10;
x2 = x2 + 10;
}
if (x2 >= 570) {
// end reached
x1 = 0;
x2 = 100;
}
repaint();
}
}
public class GraphicsApp extends JFrame {
GraphicsT gt = new GraphicsT();
public GraphicsApp() {
this.setTitle("Multiple Slide");
this.setSize(450, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.add(gt);
}
public static void main(String[] args) {
new GraphicsApp();
}
}
我目前的代码只能选择一张图片,但我想要这样一种情况,即在第一张图片离开屏幕后,第二张图片可以跟随,然后是第三张,依此类推...
非常感谢您的帮助。
几个问题:
您应该重写
paintComponent()
而不是 paint() 并调用 super.paintComponent(...) 以确保首先绘制背景。一种画法,仅作画法。你不应该做 I/O 来阅读图像。这些图像应该在 class
的构造函数中读取
你不应该在绘画方法中启动定时器。定时器在构造函数中启动。
你的基础绘画代码有误。你应该有几个实例变量,a) "currentImage", b) "imageNumber"。然后在绘画方法中,您只需在 x/y 位置绘制 currentImage 即可。
在 ActionListener 中,当图像离开屏幕时,您递增 "imageNumber" 并将图像从 ArrayList 复制到 "currentImage"。然后重置 x/y 位置,以便从右侧开始绘制图像。
当 "imageNumber" 到达 ArrayList 的末尾时,您将其重置为 0。