我想向用户展示一个10000 * 400瓦片的热图。我程序中的当前状态是我有一个JComponent
类。在此JComponent
中,我具有切片的Image
实例。如果我有一个300 * 300的矩阵,该程序将使用800至1000 MB的ram。这太多了。
我还能做些什么,或者让某个控件显示出如此大的热图?
今天,我测试了JHeatChart
,它创建了一个BufferedImage
。 10000 * 400矩阵的大小在400 MB以下,但是该类需要15分钟以上的时间来创建它。这太长了。
有没有人知道或知道可以处理数据的控件?
最佳答案
由于这将是一个地图,因此您无需为每个图块创建一个组件。其中许多可以重复使用。您想要做的是在应用程序初始化期间,创建所有可能组件的映射,然后在每个图块上传递对该组件的引用。
这是一个例子。
public class HeatMap{
private static List<JComponent> tiles = new ArrayList<JComponent>();
private List<JComponent> heatmap = new ArrayList<JComponent>();
private Random rand = new Random();
static{
tiles.add(new JLabel("Cold"));
tiles.add(new JLabel("Hot"));
tiles.add(new JLabel("Warm"));
}
public HeatMap(){
for(int i=0; i<10000; i++){
for(int j=0; j<400; j++){
heatmap.add(tiles.get(rand.nextInt(3)));
}
}
}
}
在上述情况下,我们只需要创建3个图块,其余的就是对它们的引用。这种方法应有助于减少内存使用量。