java - 加载下一个图像后刷新 JPanel

标签 java image swing slideshow thread-sleep

我创建了 ImagePanel,它能够显示指定目录中的图像 -> 它会 hibernate 1 秒并从 java 项目目录加载下一张图像。 它实际上加载了下一张图像但它没有显示(它不刷新面板),当它完成目录中的所有文件时它只显示目录中的最后一张图像。我想让它在加载每张图片后刷新。

  import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class Okno extends JFrame {
    JPanel jp;
    ImagePanel ImagePanel;
    JButton buttonExit;
    JButton buttonWyjscie;

    public Okno() {

    }

    public void createGUI() {
        setSize(400, 400);
        setLayout(new GridLayout());
        buttonExit = new JButton("Exit");
        buttonWyjscie = new JButton("Wyjscie");
        // Sluchacz sluchacz = new Sluchacz();

        // buttonExit.addActionListener(sluchacz);
        buttonExit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);

            }
        });

        jp = new JPanel();
        jp.setBorder(new LineBorder(new Color(40, 120, 80), 4));

        ImagePanel = new ImagePanel();
        ImagePanel.setBorder(new LineBorder(Color.blue, 4));
        jp.add(buttonExit);
        add(jp);
        add(ImagePanel);

        setVisible(true);
        slajd();
        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    public void slajd() {
        try {
            File f = new File(".");
            File[] tablicaPlikow = f.listFiles();
            for (File el : tablicaPlikow) {

                String rozszerzenie = el.getName().substring(
                        el.getName().length() - 3);

                if (rozszerzenie.equals("jpg") || rozszerzenie.equals("peg")) {
                    System.out.println(rozszerzenie);
                    ImagePanel.setImage(el);
                }
                repaint();
            }
            setVisible(true);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Okno().createGUI();
            }
        });

    }

}

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {
    private BufferedImage image;

    public ImagePanel() {
    }

    public ImagePanel(String sciezka) {
        setImage(new File(sciezka));
    }

    public void setImage(File plik) {
        try {
            image = ImageIO.read(plik);
            System.out.println("tutaj");
            repaint();
            Thread.sleep(1000);
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    public void paint(Graphics g) {
        if (image != null) {
            Image b = image.getScaledInstance(getWidth(), getHeight(),
                    Image.SCALE_FAST);
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }

    }

}

最佳答案

睡在EDT防止 Swing 进行绘画,因此您只能看到最后一张图像。不要在事件调度线程中 hibernate ,而是使用 swing Timer做重复的任务:

private final ActionListener timerTask = new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent e) {
        // Whatever you need to to that
        showNextImage();
    }
};

Timer timer = new Timer(1000, timerTask);
timer.start();

如果加载图像需要很长时间,请考虑使用 background task用于在内存中预加载下一个,而不会阻塞 EDT。

关于java - 加载下一个图像后刷新 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297575/

相关文章:

java - 使用 spring webflux 替代 @Cacheable

java - 请求处理失败;嵌套异常是 org.hibernate.exception.SQLGrammarException : could not insert:

python - 带有图像的 Tkinter 按钮有边框

java - 在某些情况下,删除 JTextField 单元格编辑器的边框不起作用

java - 通用 rxjava2 数据库访问层

java - 将 json 对象中的日期发送到 Restful ws

JQuery - .hover() 加载图像后并附加到 .find()div

css 图像放置

java - 遍历 Swing 中的所有复选框

java - 数据刷新后滚动条移动