【问题标题】:How to shuffle list of images?如何打乱图像列表?
【发布时间】:2014-04-08 07:49:13
【问题描述】:

我正在尝试制作一个 Java 桌面应用程序,我想在其中随机播放项目文件夹中的图像。我能够做到这一点,但我必须传递图片的名称,但我不想在我的代码中传递任何图片名称。我只想使用文件夹名称,它应该会自动从那里检索所有图像。

这是我的代码:

public class Main1 extends JFrame
{
      private java.util.List<BufferedImage> list = new ArrayList<BufferedImage>();
    private java.util.List<BufferedImage> shuffled;
    private JLabel label = new JLabel();
       private int width = 708;
    private int height = 800;
    private Timer timer = new Timer(4000, new ActionListener() {
      @Override
       public void actionPerformed(ActionEvent e) {
        update();
       }
   });

  public Main1(  )
  {
        super("Simple Timer");
      {
getContentPane().setBackground(new java.awt.Color(153,153,0));
} 
 try {
           list.add(resizeImage(ImageIO.read(new File("images\\1.jpg"))));
            list.add(resizeImage(ImageIO.read(new File("images\\2.jpg"))));
            list.add(resizeImage(ImageIO.read(new File("images\\3.jpg"))));
            list.add(resizeImage(ImageIO.read(new File("images\\4.jpg"))));
        } catch (IOException e) {
            e.printStackTrace();
        }
        shuffled = new ArrayList<BufferedImage>(list);
        Collections.shuffle(shuffled);
        timer.start();
         }

private BufferedImage resizeImage(BufferedImage originalImage) throws IOException {
        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, width, height, null);
        g.dispose();
        return resizedImage;
    }

   private void update() {
      if (shuffled.isEmpty()) {
            shuffled = new ArrayList<BufferedImage>(list);
            Collections.shuffle(shuffled);
        }

        BufferedImage icon = shuffled.remove(0);
        jLabel6.setIcon(new ImageIcon(icon));
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。 2) 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • list.add(resizeImage(ImageIO.read(new File("images\\1.jpg")))); 在加载时立即调整图像大小并不是一个好主意。通常最好在显示时调整大小(如在渲染器中)或至少缓存原始图像以防查看区域需要更改。顺便说一句 - 为什么是 708x800 尺寸的图片?我没听说过这种纵横比。
  • @Andrew Thompson 这是因为我想在 jlable 大小上调整图像

标签: java swing list jlabel shuffle


【解决方案1】:

假设文件存储在文件系统中(并且基于您的示例),您可以从给定目录中获取文件列表...

File files[] = new File("images").listFiles();

从那里你只需要遍历列表并将每一个添加到List...

for (File file : files) {
    list.add(resizeImage(ImageIO.read(file));
}

看看

更多详情...

【讨论】:

    【解决方案2】:

    此代码应适用于 Java 7

    File dir = new File("images");
    List<File> files = Arrays.asList(dir.listFiles(new FileFilter() {
       boolean accept(File pathName) {
          return pathName.getName().toLowerCase().endsWith(".jpg");
       }
    }));
    for (File f: files) {
       list.add(resizeImage(ImageIO.read(f)));
    }
    Collections.shuffle(list);
    

    在 Java 8 中,这段代码可以写成

    File dir = new File("images");
    List<File> files = Arrays.asList(dir.listFiles(
       (pathName) -> pathName.getName().toLowerCase().endsWith(".jpg");
    ));
    for (File f: files) {
       list.add(resizeImage(ImageIO.read(f)));
    }
    Collections.shuffle(list);
    

    并使用 NIO.2 和流 API:

    Path folder = Paths.get("images");
    List<Path> paths = Files.list(folder)
       .filter((path) -> path.toString().toLowerCase().endsWith(".jpg"))
       .collect(Collectors.asList());
    for (Path path: paths) {
       list.add(resizeImage(ImageIO.read(path.toFile())));
    }
    Collections.shuffle(list);
    

    【讨论】:

    • 别忘了,OP 在加载文件时正在处理它们;)
    • @MadProgrammer 谢谢:) @user3506824 你必须用各种list.add(resizeImage(...))替换块
    • 如果是 Java 7,为什么第一个代码 sn-p 仍然使用File?提示:Java 7 有 Files.newDirectoryStream()——在这种情况下,即使是 Files.newDirectoryStream(dir, "*.png") 也是可用的
    • 这更像是一个挑剔的问题;)
    猜你喜欢
    • 2015-07-16
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多