2013-06-26 62 views
0

我有一個JFrame有4個不同的面板。下圖中右邊的黑框是圖像面板。我正在嘗試編寫一個類,該類允許我將程序中的圖像加載到任何其他類中的任何Panel中。我使用的圖像加載在我的其他類圖像不加載在JPanel是JFrame內

http://sdrv.ms/14TEq2T

LoadImage.java

package sf; 

import java.awt.*; 
import java.awt.image.*; 
import javax.swing.ImageIcon; 

public class LoadImage extends Component { 

BufferedImage img; 

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

public LoadImage(String filename) { 
    try {   
     System.out.println(filename); 
     img = new ImgUtils().scaleImage(380, 360, filename);   
    } catch (Exception e) { 
     System.out.println("File not found"); 
    } 

} 

class ImgUtils { 

    public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) { 
     BufferedImage bi = null; 

     try { 
      ImageIcon ii = new ImageIcon(filename); 
      bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
      g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); 
      g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 

     return bi; 
    } 
} 
} 

代碼。

private void getProductImage() { 

    try { 
     String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
     String decodedPath = URLDecoder.decode(path, "UTF-8"); 
     String newPath = decodedPath.replace("build/classes/", "src/productImages/"); 

     productImagePanel.add(new LoadImage(newPath + imageCode + ".jpg")); 
     revalidate(); 
     pack(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

'imageCode'是一旦窗口可見並從數據庫中檢索到的代碼,並且我多次檢查了圖像的路徑。

LoadImage.java獨立工作,如果向其中添加了「主要可運行」方法,則會加載圖像,但我似乎無法在我想要的面板中顯示圖像。請諮詢如何解決我的問題,任何幫助表示讚賞!

回答

4

你的問題很可能是你試圖加載圖像作爲組件到JPanel。問題包括:

  • Component的preferredSize很可能是[0,0],所以它可以試圖顯示圖像的心臟不大,但是太小而不能實現。
  • 可能有其他組件已經添加到JPanel
  • JPanel的佈局可能無法與新添加的組件搭配使用。
  • 您不應將重量輕(重量較輕的組件)(絕大多數其他非頂級Window Swing組件)混合在一起,而無需明確的需求。

我建議:

  • 添加一個JLabel到您的圖像上創建的JPanel JPanel中顯示只有一次。
  • 爲您的productImagePanel提供一種方法,該方法接受Image或ImageIcon,然後從Image創建ImageIcon或使用提供的ImageIcon設置JLabel的圖標。
  • 確保JPanel使用允許JLabel完全顯示其自身的佈局。佈局管理器教程可以爲此提供幫助。
  • 無論是或所有圖像顯示JPanel是爲了顯示圖像,沒有別的,擺脫它,而是使用JLabel本身,並直接添加您的圖標。

同樣作爲旁白:你應該處置任何圖形和Graphics2D的對象是創建(但不包括任何由JVM給你)。這意味着,當您在ImageUtilities中使用g2d完成繪圖時,請將其處理掉。

+0

感謝您的意見。我熟悉使用JLabel的Icon來顯示圖像。我試圖避免必須使用JLabel來顯示圖像,但如果我沒有使用這些方法,我會使用它.. – HMH

+0

此外,LoadImage.java中的類Imgutils正在調整圖像大小以適應JPanel的大小,我認爲大小不是問題。此外,在初始化並顯示幀時,面板是空的,沒有其他組件。 – HMH

+0

@HHH:你可以將圖像加載到一個JPanel中,並使用JPanel的paintComponent方法繪製它,但是如果你這樣做了,我會將JPanel從開始添加到GUI並只改變圖像部分本身。換句話說,繪圖組件不應該改變,但它繪製的圖像可能被允許改變。但是,我敢打賭,你的組件的大小是0,0或1,1。你可以在paint方法中加入一個'System.out.println(getSize())'來測試你所知道的。另外,如果不需要這樣做,您應該避免混合重量輕和重量輕的組件。 –