Jframe中的图像未刷新

时间:2015-10-02 16:39:55

标签: java jframe

我正在编写在某个目录中的Jframe中显示图像的代码。 Jframe将一次显示一个图像。

我的代码显示jframe的大小发生了变化但图像没有变化。 我把revalidate和paint放了,但图片没有刷新。

这是updateFrame函数,它具有更新逻辑。

private void updateFrame(JFrame f, String billBoardImageFileLocation, int imageNumber) throws ClassNotFoundException, IOException {
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); //this is your screen size
    File folder = new File(billBoardImageFileLocation);
    String[] extensions = new String[]{"jpeg", "jpg"};
    List<File> imageFiles = (List<File>) FileUtils.listFiles(folder, extensions, false);
    ImageIcon image = new ImageIcon(ImageIO.read(imageFiles.get(imageNumber % imageFiles.size()))); //imports the image

    if (isDebug.equals("Y")) {
        System.out.println("Files:" + imageFiles.get(imageNumber % imageFiles.size()).getAbsolutePath());
    }

    JLabel lbl = new JLabel(image); //puts the image into a jlabel\
            f.getContentPane().add(lbl); //puts label inside the jframe
    f.setSize(image.getIconWidth(), image.getIconHeight()); //gets h and w of image and sets jframe to the size
    f.getContentPane().revalidate();
    int x = (screenSize.width - f.getSize().width) / 2; //These two lines are the dimensions
    int y = (screenSize.height - f.getSize().height) / 2; //of the center of the screen
    f.setLocation(x, y); //sets the location of the jframe
    f.setVisible(true); //makes the jframe visible
    f.revalidate(); // **** added ****
    f.repaint();
    f.getContentPane().revalidate();
    f.getContentPane().repaint();
}

这是我调用updateFrame函数的方法。

try
{
    pProcess = pb.start();
    if (showBillBoard.toUpperCase().equals("Y")) {
        ProcMon proMon = new ProcMon(pProcess);
        Thread t = new Thread(proMon);
        t.start();
        JFrame f = new JFrame(); //creates jframe f

        if (isDebug.equals("Y")) {
            System.out.println("Starting Thread");
        }
        int imageNumber = 0;

        while (!proMon.isComplete()) {
            updateFrame(f, billBoardImageFileLocation, imageNumber);
            Thread.sleep(Integer.parseInt(billBoardImageUpdateInterval)*1000);
            if (isDebug.equals("Y")) {
                System.out.println("Updating Framework");
            }
            imageNumber++;

        }
        f.dispose();
    }
}

2 个答案:

答案 0 :(得分:1)

JLabel lbl = new JLabel(image);

不要创建新标签,只需更新现有标签的图标:

label.setIcon( image );

因此,更改方法参数以传递标签和框架。

这就是你需要做的一切。

答案 1 :(得分:1)

你正在Swing事件线程上执行长时间运行的代码,冻结它。解决方案:不要。使用Swing Timer交换图像,因为这将允许重复操作不会踩到Swing事件线程。也永远不要在这个帖子上调用Thread.sleep。有关EDT,Swing事件派发线程的更多信息,请阅读Concurrency in Swing