2012-02-05 12 views
3

独自のバージョンのJButtonをペイントしたいので、paintComponent()メソッドをオーバーライドし、グラデーションroundRectを描画しました。これはうまくいきますが、その後、ボタンの文字列を描画したいので、コンパイル時にエラーメッセージは表示されません。しかし、実行時に、私は私が(私もそれをクリックすることができます)であることを、それを意図したのと同様に、roundRect、勾配を参照してください、しかし、文字列が見えない...JButtonのpaintComponent()をオーバーライドすると動作しませんJava

は、ここに私のコードです:

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

public class JIconButton extends JButton implements MouseListener 
{ 
    private boolean mouseInside; 
    public JIconButton(String file, String text) 
    { 
     super(text, new ImageIcon(file)); 
     setBorder(new LineBorder(Color.LIGHT_GRAY, 0, true)); 
     setContentAreaFilled(false); 
     setFocusPainted(false); 
     addMouseListener(this); 
     setVisible(true); 
    } 

    public void mouseClicked(MouseEvent e) 
    { 

    } 

    public void mouseEntered(MouseEvent e) 
    { 

    } 

    public void mouseExited(MouseEvent e) 
    { 

    } 

    public void mousePressed(MouseEvent e) 
    { 

    } 

    public void mouseReleased(MouseEvent e) 
    { 

    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D)g.create(); 
     g2.setPaint(Color.BLACK); 
     g2.drawString(getText(), 0, 0); 
     g2.setPaint(new GradientPaint(
       new Point(0, 0), 
       Color.WHITE, 
       new Point(0, getHeight()), 
       Color.PINK.darker())); 
     g2.fillRoundRect(0, 0, getWidth(), getHeight(), 30, 30); 
     g2.dispose(); 

     //super.paintComponent(g); 
    } 
} 
+0

グラデーションをペイントした後に*あなたが文字列*を描くとどうなりますか?ボタンのイメージで単にBufferedImageを作成し、ImageIconを作成してボタンのアイコンを設定するのが良い方法です。これで成功するには、マージンと境界線を取り除く必要があると私は思っていますが、 –

+0

mouseIn、mousePressedなどをアニメーション化するためのmouseListenerが必要でしたが、うまくいきましたが、今はそのStringを描画したいだけです。 – 11684

+0

@HovercraftFullOfEels私はそれを最初に試みたが、それはうまくいかなかった... – 11684

答えて

5

を変更することができますのJButtonのメソッドになりますたとえば :

あなたがしなければならない
@Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, 
      getHeight()), Color.PINK.darker())); 
     g2.fillRoundRect(0, 0, getWidth(), getHeight(), 30, 30); 
     g2.setPaint(Color.BLACK); 
     g2.drawString(getText(), 30, 12); 
     g2.dispose(); 

     // super.paintComponent(g); 
    } 
+1

MouseListenerを持つJLabel :-) +1 – mKorbel

+0

なぜsuper.paintComponentがコメントされていますか? – nachokk

3

:ベースラインとないの地点の出発点であるため、文字列の

g2.drawString(getText(), 0, 10); 

y座標は、0より大きくなければなりません箱の左上隅。 最終的なコード:

@Override 
protected void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g.create(); 
    g2.setPaint(new GradientPaint(
    new Point(0, 0), 
    Color.WHITE, 
    new Point(0, getHeight()), 
    color.PINK.darker())); 
    g2.fillRoundRect(0, 0, getWidth(), getHeight(), 30, 30); 
    // The drawString(string) must be put after the setPaint(gradient) 
    g2.setPaint(Color.BLACK); 
    g2.drawString(getText(), 0, 10); 
    g2.dispose(); 
} 
+0

はい、私はすでに知りました。ありがとう!それにもかかわらず、良い助言が – 11684

+0

です。 :) 1+ –

関連する問題