我正在尝试使用for循环迭代两个列表,但我得到的迭代次数与每个列表中的项目数相同。
List<String> l = new ArrayList();
l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
l.add("E:/IMG_1241.mp4");
Image[] images = new Image[l.size()];
ImageView[] pics = new ImageView[l.size()];
for (final String imageResource : l) {
for (int i = 0; i < l.size(); i++) {
通过上述程序产生最终的4个项目。如果List<String> l
有四个项目,则16个,即4个项目迭代4次,如果有3个项目。
我想像for (int i = 0, int iL; int iL < l.size(), i < l.size(); iL++, i++) {
这样的for循环,但我不确定它是如何解决的。
请帮忙。
完整的程序看起来像这样:
public class TilePaneExample {
public javafx.scene.layout.TilePane listItems() {
List<String> l = new ArrayList();
l.add("C:/Users/Public/Music/Sample Music/Maid with the Flaxen Hair.mp3");
l.add("C:/Users/Public/Videos/Sample Videos/Wildlife.wmv");
l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");
// Pane
javafx.scene.layout.TilePane tilePane = new javafx.scene.layout.TilePane();
tilePane.setHgap(2);
tilePane.setVgap(2);
tilePane.setMinWidth(250);
Image[] images = new Image[l.size()];
ImageView[] pics = new ImageView[l.size()];
for (final String imageResource : l) {
for (int i = 0; i < l.size(); i++) {
final String imageResourceItem = l.get(i);
images[i] = new Image("file:" + "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg");
pics[i] = new ImageView(images[i]);
pics[i].setFitWidth(22);
pics[i].setPreserveRatio(true);
pics[i].setSmooth(true);
pics[i].setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
File f = new File(imageResourceItem);
String absolutePath = f.getAbsolutePath();
if (imageResource.startsWith("file:")) {
absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", "");
}
String ext = FilenameUtils.getExtension(absolutePath);
System.out.println("You clicked: " + absolutePath + ". The extension is: " + ext);
try {
Desktop.getDesktop().open(new File(absolutePath));
} catch (IOException ex) {
Logger.getLogger(TilePaneExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
tilePane.getChildren().add(pics[i]);
}
}
return tilePane;
}
}
我正在使用Windows 7默认示例文件,所以应该没有太多的修改工作。尝试执行它,你就可以了解我正在努力完成的事情。
谢谢。
更新:
应用程序的工作原理如下:例如,List l
,l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");
中的每个链接都有一个图像。存在与链接一样多的图像,因此有两个循环。外部循环for (final String imageResource : l) {
获取链接,内部循环for (int i = 0; i < l.size(); i++) {
创建可点击的图像,单击该图像时会打开资源,视频,图片或音乐文件。
答案 0 :(得分:0)
我假设您正在尝试加载文件名在列表l
中的图片。这意味着您只需要一个for
循环。
答案 1 :(得分:0)
你可以这样做:
public class TilePaneExample {
public javafx.scene.layout.TilePane listItems() {
List<String> l = new ArrayList();
l.add("C:/Users/Public/Music/Sample Music/Maid with the Flaxen Hair.mp3");
l.add("C:/Users/Public/Videos/Sample Videos/Wildlife.wmv");
l.add("C:/Users/Public/Pictures/Sample Pictures/Koala.jpg");
l.add("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");
// Pane
javafx.scene.layout.TilePane tilePane = new javafx.scene.layout.TilePane();
tilePane.setHgap(2);
tilePane.setVgap(2);
tilePane.setMinWidth(250);
Image[] images = new Image[l.size()];
ImageView[] pics = new ImageView[l.size()];
//for (final String imageResource : l) { // removed first loop
for (int i = 0; i < l.size(); i++) {
final String imageResourceItem = l.get(i);
images[i] = new Image("file:" + "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg");
pics[i] = new ImageView(images[i]);
pics[i].setFitWidth(22);
pics[i].setPreserveRatio(true);
pics[i].setSmooth(true);
pics[i].setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
File f = new File(imageResourceItem);
String absolutePath = f.getAbsolutePath();
if (l.get(i).startsWith("file:")) { // changed the imageResourceItem into l.get(i)
absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", "");
}
String ext = FilenameUtils.getExtension(absolutePath);
System.out.println("You clicked: " + absolutePath + ". The extension is: " + ext);
try {
Desktop.getDesktop().open(new File(absolutePath));
} catch (IOException ex) {
Logger.getLogger(TilePaneExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
tilePane.getChildren().add(pics[i]);
}
}
return tilePane;
//}
}
没有第一个循环,你仍然可以使用:l.get(i)访问你的链接
第一个循环正在做的只是将List的内容分配给最终的String imageResource,然后将在您的代码中使用:
if (imageResource.startsWith("file:")) {
absolutePath = absolutePath.replace("\\standAloneDev\\java\\workingDir\\live\\WakiliProject\\file:D:", "");
}
因此,为了使其高效,您可以做的是删除第一个循环,而不是使用imageResource作为条件运算符,您可以使用l.get(i)代替。您无需通过第一个循环将其分配给String变量。
希望这能回答你的问题