我正在编写在某个目录中的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();
}
}
答案 0 :(得分:1)
JLabel lbl = new JLabel(image);
不要创建新标签,只需更新现有标签的图标:
label.setIcon( image );
因此,更改方法参数以传递标签和框架。
这就是你需要做的一切。
答案 1 :(得分:1)
你正在Swing事件线程上执行长时间运行的代码,冻结它。解决方案:不要。使用Swing Timer交换图像,因为这将允许重复操作不会踩到Swing事件线程。也永远不要在这个帖子上调用Thread.sleep
。有关EDT,Swing事件派发线程的更多信息,请阅读Concurrency in Swing。