2011-11-23 99 views
6

我最近閱讀了這個線程(Creating a custom button in Java)關於通過擴展JButton類在java中創建自定義按鈕,但是此線程上的所有解決方案都使用用java繪製的圖形。如何使用圖像庫在java中創建自定義JButton?

我想讓我的按鈕基於我在Photoshop中繪製的按鈕圖像。於是,我就運用我在那個線程對這個結果看:

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

public class nextButton extends JButton { 
    @Override 
     protected void paintComponent(Graphics g) { 
     Image image = new ImageIcon("nextButton.png").getImage(); 
     g.drawImage(image,0,0,this); 
} 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension size = super.getPreferredSize(); 
     size.setSize(75, 150); 
     return size; 
    } 
} 

當我運行已經添加了這個按鈕,一個JPanel主程序不顯示。我假設它可能是幾個原因之一:

a)JButton的大小不匹配的圖像? b)我沒有正確加載圖像。在筆記中,我的講師給了我他寫出了帶有「imageName.png」的顯示圖像代碼,沒有文件路徑,所以我不知道這是否是正確的方法,或者程序知道如何加載圖像。 c)迄今爲止我還不瞭解的其他東西。

如果有人知道如何解決這個問題,我會非常感激。

非常感謝!

+0

一對夫婦的意見,或多或少無關你的問題:一)的paintComponent越權非法B)永不永遠_change_特別是在吸氣Ç任何東西),的setSize完成通過LayoutManager無論如何都不會影響一個理智的應用程序d)重寫getPreferredSize並根據組件的內部結果返回合理的尺寸提示是正確的,這裏可能是圖像的大小e)將圖像加載到繪畫中(在繪畫循環中不會有繁重的工作!),而不是在施工時加載一次 – kleopatra

+0

btw,請學習java命名約定並堅持使用它們 – kleopatra

回答

4

首先,您應該使用ImageIO.read(new File("somefile.png"))加載Image。請注意,如果沒有指定絕對路徑,它將默認爲相對於工作目錄。如果你用完了eclipse,那就是項目文件夾。從罐子裏出來,它就是罐子所在的文件夾(除非另有說明)。

請參閱http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html瞭解如何正確加載圖像(也說明如何從applet中執行此操作)。

此外,您應該加載圖像一次,然後再用它每一塗料迭代:

BufferedImage image; 

public nextButton() { 
    try { 
     image = ImageIO.read(new File("nextButton.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image, 0, 0, null); 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(image.getWidth(), image.getHeight()); 
} 

讓我知道這對你的作品(確保把你的PNG工作目錄! )。

+0

a)不要使用setXXSize,而要重寫getPreferredSize(你已經繼承了子類,沒有理由馬虎;-) b) paintComponent覆蓋是非法的,它必須遵守其不透明合同 – kleopatra

+0

-1 ahhh ...只是看到了你的編輯,這是錯誤的:覆蓋getPref _certainly_是要走的路。 – kleopatra

+0

@kleopatra啊對不起,我想我錯了。修復它與編輯。我太習慣於一起使用黑客入侵Swing的東西,我會記住關於setSize的事情。缺少'super.paintComponent'是我的一個錯誤,我知道這是錯誤的,所以我也修正了這個錯誤。 – jli

5

我問這個問題早爲好。我發現最好的解決方案實際上是這樣做的,而不是繪圖。

ImageIcon icon = new ImageIcon("pathOfImageHere.png"); 
JButton button = new JButton(icon); 

因此,將按鈕設置爲圖像。現在我選擇做的是使按鈕不可見並刪除所有邊框。所以,我沒有這下:

button.setOpaque(false); 
button.setContentAreaFilled(false); 
button.setBorderPainted(false); 
button.setFocusPainted(false); 
+0

更多的,我們可以定義不同的按鈕狀態圖像(參見:[鏈接](http://www.leepoint.net/notes-java/GUI/components/20bu​​ttons/23buttonicons.html))。這個技巧的解決方案非常完美! – Alexxx

相關問題