【问题标题】:Display a big number of images into a grid在网格中显示大量图像
【发布时间】:2012-07-30 14:18:46
【问题描述】:

我有一个应用程序,我想在其中显示许多图像组件。其中的每个项目都是一个custom jcomponent,它将在BufferedImage 对象中包含图像,以便在paintcomponents(Graphics g) 覆盖方法中绘制它。我还将使用JPanel 用于网格,gridlayoutflowlayout 用于放置自定义图像jcomponents,网格的布局也将在JscrollPane 内。

我的问题是,当我必须放入网格的图像数量变大时会发生什么。使用jscrollpane,组件的数量因此必须绘制的图像数量将小于20-30个组件,但每个插入网格的组件都会有一个BufferedImage对象来保存相应的图像。这对性能和内存消耗有害吗?可以使用一些模式吗?例如,如果我使用主要参考点将图像从磁盘加载到bufferedimage,并且根据scrollpane 的哪个矩形,用户然后释放一些缓冲图像,他们从@ 的当前位置存放在网格中987654332@?

谢谢。

【问题讨论】:

  • 谢谢,您的意思是,使用带有Custom cell renderer 的JTable 在单元格内显示我的自定义JComponent,因为JTable 只会在特定单元格处于可见状态时调用渲染器滚动窗格的区域,因此不会浪费内存,加载所有图像。但是已经从磁盘加载新图像,不是问题吗?

标签: java swing memory-management bufferedimage


【解决方案1】:

您将必须对基本变量进行原型设计并分析结果。然后将这些结果与您的最低公分母目标平台上可用的功能进行比较。 sscce 非常宝贵。例如,这个one 可以让您轻松改变N 的图像数量。

提到了一些视图替代方案here

注释中注明:为了节省内存,请考虑使用LRU cache

【讨论】:

  • 谢谢你,你也给我一个使用JTable的示例代码你同意我上面对@max的评论
  • 我希望JTable 渲染能够更好地扩展,但您必须对原型进行概要分析。为了节省内存,请考虑使用LRU cache。不要忽视对您认为有帮助的答案进行投票。
  • 谢谢,我会看看如何在我的应用程序中使用jtable,还会看到你给我的 LRU 缓存帖子。很抱歉忽略了投票!
  • 谢谢,LRU 缓存正是我想要的!
【解决方案2】:
  1. 线程加载图像,以便 UI 不会因加载而延迟
  2. 缩放图像,可能适合面板的大小,浪费内存没有意义

【讨论】:

  • 嗨,第一个好的,当然我将加载到一个单独的线程中。但是对于第二个,我希望图像缩略图具有适合用户查看的默认大小,将使用滚动窗格查看额外的图像
  • @trashgod 谢谢你,我会看到你发给我的例子!
  • @javment 的基本思想是,如果您不需要以全分辨率(所有时间)显示图像,最好在加载图像时缩放图像,而不是浪费内存(和时间尝试实时缩放图像)
  • @MadProgrammer 你说得对,因此我已经创建了图像的缩略图,以我想要显示的特定分辨率并将这些缩略图保存到磁盘。更具体地说,我进行了快速扫描文件夹中,找到图片,为每张图片创建对应的缩略图,保存到指定的文件夹中,之后我会显示出来。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2013-04-19
  • 2018-05-10
相关资源
最近更新 更多