2011-03-11 133 views
1

我正試圖加載一些圖像使用Java,但它似乎是非常緩慢,它約13圖像我試圖讓每個9KB大小。加載圖像是非常緩慢的java

是我的代碼還是它是java導致的問題。我可以使用瀏覽器更快地加載所有圖像。

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import java.net.*; 

import javax.imageio.ImageIO; 
import javax.swing.*; 


public class ImageSample { 
    static public void main(String args[]) throws Exception { 
    JFrame frame = new JFrame("Display image"); 

    //Image url here 
    String url=""; 

    JPanel panel = new testImage(); 
    frame.add(panel); 
    frame.setSize(500, 500); 
    frame.setVisible(true); 
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); 

    } 
} 

class testImage extends JPanel { 

    static Image image; 

    public void testImage(String url) 
    { 
     image = Resources.getImage(url); 
    } 
    public void paintComponent(Graphics g) { 
    g.drawImage(image, 0, 0, 40, 40, null); 
    } 
} 

class Resources 
{ 
    private static Resources myResource = new Resources(); 

    // NOTE: there is no error checking here so if parameter is mistyped 
    // somewhere else in code, then this will probably throw a nullpointerexception 
    public static Image getImage(String name) 
    { 
    // TODO: Find out which way is better or preferred 
    URL url=null; 
    try { 
     url = new URL(name); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return Toolkit.getDefaultToolkit().getImage(url); 

    } 
} 

感謝, Sreejith

+5

你還可以加載一些示例代碼嗎? – adarshr 2011-03-11 10:43:08

+0

您能否提供更多信息(例如代碼的關鍵部分)? – MAK 2011-03-11 10:43:11

+1

根據定義,它的代碼*由於效率不高而導致問題。唯一真正的問題是Java是否允許編寫高效的代碼。無論如何,你應該解釋你正在使用什麼類和方法,因爲沒有這個問題是無法回答的。 – 2011-03-11 10:43:50

回答

2

嘗試用你的形象這個例子。這並不慢。

public class ImageLoad extends JFrame { 

    public ImageLoad() { 
     setSize(800, 800); 
     JPanel panel = new JPanel(); 
     ImageIcon icon = new ImageIcon("singer.jpg"); 
     JLabel label = new JLabel(); 
     label.setIcon(icon); 
     panel.add(label); 
     add(panel); 
    } 

    public static void main(String[] args) { 
     new ImageLoad().setVisible(true); 
    } 
} 
+0

謝謝 我認爲我應該使用線程來加載所有的圖像在同一時間,而不是一個接一個地加載它 – sreejith 2011-03-12 05:56:07

+0

工作真棒罰款和快速。謝謝 – sreejith 2011-03-12 06:01:25

3

你的程序實際上並未做你覺得它在做什麼,因爲你有你的類和方法名做了一些基本的錯誤是什麼:

class testImage extends JPanel { 

    static Image image; 

    public void testImage(String url) 
    { 
     image = Resources.getImage(url); 
    } 
    public void paintComponent(Graphics g) { 
    g.drawImage(image, 0, 0, 40, 40, null); 
    } 
}

的標準是,類名應該總是首先大寫字母和方法名稱應以小寫字母開頭以避免混淆。因爲你對這兩者感到困惑,所以你沒有注意到你在這個類中聲明的testImage(url)是一個方法,而不是的一個構造函數,儘管這個名字是相同的。因此,當您調用JPanel panel = new testImage();時,您並未調用該方法 - 如果在代碼中未聲明構造函數,則只需調用默認的空構造函數即可獲得每個類。還請注意,您沒有使用變量url,並且您的字段image不應該是靜態的。

說實話,你會以錯誤的方式處理整件事情,應該從頭開始。 Costis的解決方案看起來不錯。您一定要試一試ImageIcon,因爲它們消除了手動獲取資源URL並呈現它的艱鉅工作。

+0

他說圖像加載緩慢。我想知道他是如何通過調用空構造函數來加載圖像的。 – Nipuna 2011-03-11 12:24:41

+0

他發佈的代碼與他正在運行的代碼不一樣,或者圖像從未加載 - 這在技術上非常非常慢。 ;) – BoffinbraiN 2011-03-11 17:03:05

+0

我用相同的代碼,除了一個輕微的國防部。我直接使用圖像url而不是將其作爲參數傳遞,因此當時不需要構造函數。 修改了用於設置動態圖像的代碼,但它現在是越野車 感謝您的建議,我將與ImageIcon一起去。 – sreejith 2011-03-12 05:54:57