2011-08-10 59 views
0

我想向用戶顯示10000 * 400的熱點圖。我的課程目前的狀態是我有一門課是JComponent。在JComponent中,我有瓷磚的實例Image。如果我有一個300 * 300的矩陣,程序使用800到1000 MB RAM。這太多了。在java中有10000 * 400點的熱圖

我可以做些什麼或有人控制它可以顯示這麼大的熱圖?

今天我測試了JHeatChart,它創建了一個BufferedImage。 10000 * 400矩陣的大小在400 MB以下,但該類需要15分鐘以上來創建它。這太長了。

有沒有人有一些idee或知道可以處理數據的控件?

+0

您是否每次創建新的瓷磚時都加載圖像?內存使用情況似乎非常高。你可能想要在你的瓷磚創作周圍發佈相關的代碼 – Sean

回答

2

由於這將是一張地圖,因此不需要爲每個圖塊創建一個組件。其中許多可以重新使用。你想要做的是在應用程序的初始化過程中,創建所有可能組件的映射,然後在每個tile上傳遞對該組件的引用。

這裏是一個例子。

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個貼圖,其餘的都是對這些貼圖的引用。這種方法應該有助於減少內存使用量。

2

您可以嘗試縮放您的地圖。因此,不要將每個拼貼都打印到屏幕上,如果放大很多,請使用更大的拼貼。人們也可以嘗試將單個拼貼合併到一個對象,而不是保留每個拼貼的引用。

1

瓷磚是否真的必須表現爲圖像或彩色框是否足夠?

如果一個彩色框就足夠了,你可以在你的paint(...)方法中繪製可見的圖塊。不需要加載這些圖像。

如果它必須是圖像,我假設並非每個圖塊都是唯一的,因此不是每個圖塊加載一個圖像,而是嘗試加載所有需要的圖像,並讓圖塊參照相應的圖像。因此,如果你有100個不同的圖像,而不是有4000000個副本,你會有100和4000000相當小的引用。

1

無論你如何呈現它,用戶將永遠無法同時感知400萬個數據點。因此,你不應該有四百萬個圖形小部件。要麼縮小顯示器,要麼縮放(當放大時),您應該一次只顯示所有圖塊的子集。無論哪種方式,您都必須將名義上的4,000,000映射到少得多的圖形小部件,並重用已有的圖形小部件。

正如其他答案已經指定,你還應該考慮使用最簡單的可能的Widget類型來完成這項工作。

1

顯然,10000 * 400的瓷磚太多了,無法一次查看。而是使用fly-weight pattern來僅渲染在JScrollPane的視口中可見的圖塊。 JTable就是一個例子。