2010-08-29 142 views
0

我想创建一个面板更改图片。 这是我的面板:帧刷新问题

public class AdvertisementPanel extends JPanel { 
private BufferedImage image; 

private ArrayList<String> pictures; 
private int index = 0; 

public AdvertisementPanel(String... pics) { 
pictures = new ArrayList<String>(Arrays.asList(pics)); 
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
new Runnable() { 
    @Override 
    public void run() { 
    changeImage(); 
    } 
}, 0, 5, TimeUnit.SECONDS); 

} 

public void paint(Graphics g) { 
g.drawImage(image, 0, 0, null); 
} 

private void changeImage() { 
String name = pictures.get(index); 
try { 
File input = new File(name); 
image = ImageIO.read(input); 
index++; 
index %= pictures.size(); 
} catch (IOException ie) { 
Logger.getLogger().log(Level.SEVERE, 
    "No adds found in given path: " + name); 
} 
} 

我有保持面板的框架,但没有图片显示。 试图定期从框架重新绘制 - 造成了一些有趣的,但不想要的结果... 任何想法为什么?我究竟做错了什么?我应该如何刷新框架的组件?

+1

'repaint'可能是答案。但我只想提到你应该重写'paintComponent'而不是'paint'。你也可以扩展'JComponent'而不是'JPanel'(一些botchers扩展了'JPanel',因为它会为你调用'setOpaque(true);'(考虑到这个努力!),只有'JPanel'没有如果你喜欢冒险的话,可以使用源代码或者API文档),但是一些PL&F可以,而'image'应该是'volatile',或者很好地传递给EDT。 – 2010-08-29 20:51:02

回答

1

每次更改图像时都需要重新绘制。

哦,它应该由Swing事件处理线程来完成:

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
new Runnable() { 
    @Override 
    public void run() { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     changeImage(); 
     repaint(); 
     } 
    }; 
    } 
}, 0, 5, TimeUnit.SECONDS); 

更新来其他的一些问题

public class AdvertisementPanel extends JPanel { 
    private BufferedImage image; 
    private ArrayList<String> pictures; 
    private int index = 0; 

    public AdvertisementPanel(String... pics) { 
     pictures = new ArrayList<String>(Arrays.asList(pics)); 
     Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
      new Runnable() { 
       @Override 
       public void run() { 
        changeImage(); 
       } 
      }, 0, 5, TimeUnit.SECONDS); 
    } 

    private void changeImage() { 
     final BufferedImage img = nextImage(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       image = img; 
       repaint(); 
      } 
     }); 
    } 

    public void paint(Graphics g) { 
     if (image != null) { 
      g.drawImage(image, 0, 0, null); 
     } 
    } 

    private BufferedImage nextImage() { 
     String name = pictures.get(index); 
     try { 
      index++; 
      index %= pictures.size(); 
      File input = new File(name); 
      return ImageIO.read(input); 
     } catch (IOException ie) { 
      Logger.getLogger("").log(Level.SEVERE, 
        "No adds found in given path: " + name); 
      return null; 
     } 
    } 
} 
+0

如何?我没有图形对象。你可能不想在EDT上做文件I/O – Udi 2010-08-29 20:31:40

+1

5秒钟后(第二次迭代..)帧被重新粉刷所有创造一个混乱...为什么? – 2010-08-29 20:47:47

+0

感谢评论人员Maurice - 我使用了你的代码,并且它开始很棒,但是它可能会在一段时间内改变一次? – Udi 2010-08-29 21:01:56