2014-01-28 53 views
0

我有一個擴展JLabel的類,在標籤的整個innerArea上顯示圖像。
要做到這一點,我重寫的paintComponent這樣的:強制顯示JLabel子類

protected void paintComponent(Graphics g) { 

    super.paintComponent(g); 

    if(image != null) { 
     SwingUtilities.calculateInnerArea(this, innerArea); 
     g.drawImage(image, 0, 0, innerArea.width, innerArea.height, this); 
    } 

} 

我認爲它應該工作使用構造如下:

public ImageLabel(String img) { 

    super(); 
    this.image = new ImageIcon(this.getClass().getResource(img)).getImage(); 
    repaint(); 

} 

但我有問題,該標籤已經基本沒有大小,因爲它沒有實際的內容。
當使用super(" ");而不是一切看起來我實際上預期。

現在我想知道 - 這是一個合法的方式來解決這個問題,或者我錯過了一些其他(可能更好)的方式?

+2

你爲什麼不乾脆調用'new JLabel(new ImageIcon(this.getClass()。getResource(img))。getImage())'? – BackSlash

+0

據我發現,這樣ImageIcon將不會調整大小 –

回答

2

雖然技術上你可以油漆在JLabel,但最好塗在JPanel。你所擁有的代碼似乎很好,只需將其轉換爲JPanel即可。

「但是,我有問題,標籤基本沒有大小,因爲它沒有實際的內容。」

當繪畫的時候,你想記得也要重寫getPreferredSize()。油漆不是真正的內容,所以不會有任何優先的尺寸。原因是,它通過傳遞參數而起作用,即傳遞給它的字符串是內容,這使得標籤的首選大小與傳遞給它的字符串相匹配。但就像我說的,用JPanel這樣

public class ImagePanel extends JPanel { 
    private final int D_W = 400; 
    private final int D_W = 400; 
    private BufferedIMage imag; 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(D_W, D_H); 
    } 
} 
+1

所以我至少在正確的方式,謝謝你使這個更清晰! –

1

peeskillet已經給了一個合適的答案(https://stackoverflow.com/a/21401576/3182664)。然而,爲了實現通常的行爲(即,服從一個由Component#setPreferredSize(Dimension)方法建立了總承包),該getPreferredSize()方法實際上應該重寫這樣的:

@Override 
public Dimension getPreferredSize() { 
    if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
    } 
    return new Dimension(D_W, D_H); 

    // Could also return this, to make the panel's 
    // preferred size match the image size 
    //return new Dimension(image.getWidth(this), image.getHeight(this)); 
} 
+0

也有幫助的信息,謝謝。 –