2011-11-23 17 views
6

私は最近JButtonクラスを拡張することで、このスレッド(Creating a custom button in Java)を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

コメントのカップル、:a)のpaintComponentをオーバーライドが不正Bである)決して、これまではゲッターCには何も_change_)特には、setSizeが行われますとにかくLayoutManagerによると、正常なアプリケーションでは何の効果もありませんd)getPreferredSizeをオーバーライドして、コンポーネントの内部に基づいて適切なサイジングヒントを返します。ここではイメージのサイズになります。e)ペイントにイメージをロードします(ペイントサイクルで重く持ち上げることはありません!)、代わりに構築時に – kleopatra

+0

btwを一度ロードしてください。Java命名規則を学んでください。 – kleopatra

答えて

4

をロードするには、ImageIO.read(new File("somefile.png"))を使用する必要があります。絶対パスが指定されていない場合は、ワーキングディレクトリからの相対パスがデフォルトになります。あなたがEclipseを使い果たしているなら、それはプロジェクトフォルダです。 jarファイルからは、jarが入っているフォルダです(特に指定しない限り)。

画像を正しく読み込む方法については、http://docs.oracle.com/javase/tutorial/2d/images/loadimage.htmlを参照してください(アプレット内からの操作方法も記載しています)。

また、あなたは、各塗料の反復のためにそれを再利用し、いったん画像をロードする必要があります。

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をオーバーライドしてください(既にサブクラス化しています。 paintComponentのオーバーライドは不正です。不透明度コントラクト – kleopatra

+0

-1 ahhhに準拠するように実装されている必要があります。ちょうどあなたの編集を見ました。それは単に間違っています:オーバーライドするgetPref _certainly_は方法です。 – kleopatra

+0

@kleopatraああ、申し訳ありませんが、私は間違っていたと思います。それを編集で修正しました。私はあまりにもスイングのものをハックして作業するのに慣れているので、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

他のボタンの状態イメージを定義することもできます([link](http://www.leepoint.net/notes-java/GUI/components/20bu​​ttons/23buttonicons.html)参照)。そのトリックのあなたのソリューションは完璧に機能しました! – Alexxx

関連する問題