2012-02-09 9 views
1

私はコンテナとして使用するJPanelを継承するPanelFormesクラスを持っています。私はまた2つのJPanelを持っています。一つはJPanel、もう一つはボタンがあります。これらの2つのJPanelは、BorderLayoutを使用して、最初のJPanelに含まれています。repaint()を呼び出すときの奇妙なJPanelの動作

私のボタンの1つは、数字が必要なJPanelのrepaintメソッドを呼び出すことになっています。私のメインウィンドウのコンストラクタで、私はそれを行う:

boutonGetForme.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     ajoutForme(rect); 
    } 
}); 

方法ajoutFormeを、私のメインウィンドウクラスに:

// Methode ajout de forme, normalement appelee par le controleur 
public void ajoutForme(Forme f) { 

    //dire au jpanel quelle forme on veut dessiner et comment 
    jpanel.definirForme(f); 
    //mettre a jour le jpanel 
    jpanel.repaint(); 
} 

そして最後にクラスPanelFormes:

package gui; 

import java.awt.Graphics; 
import javax.swing.JPanel; 

public class PanelFormes extends JPanel { 

private Forme f; 
PanelFormes() { 
    f = new Rectangle(1,1,1,1); 
} 
public void definirForme(Forme f) { 
    this.f = f; 
} 
public void paintComponent(Graphics g) { 
    //dessiner la forme 
    f.dessine(g); 
}    
} 

私は私だと思いますすべての関連情報を提供しました。 私の問題は、buttonGetFormeボタンを使ってFigureをペイントしようとすると、Figureを取得するだけでなく、ちょうど私が押したボタンの奇妙なスクリーンショットコピーが、私の左上隅にペーストされますJPanel、私は本当にどう思っていますか? ajoutFormeを直接呼び出してFigureをペイントしようとすると、正常に動作します。 ActionListenerで何かがあるに違いないが、私は何を理解することができない... 私はJavaでnewbee、任意のヘルプは非常に高く評価されます。 ありがとう

+0

これも[回答](http://stackoverflow.com/a/9029316/230513)を参照してください。 – trashgod

+0

this.setOpaque(true)を追加しました。私のFormePanelコンストラクタでは、問題はまだそこにあります。 – CTZStef

答えて

2

setOpaque(true)の場合は、コンポーネントの境界で定義されている領域が完全にレンダリングされていることを確認してください。そうでない場合は、setOpaque(false)を使用します。問題が解決しない場合は、sscceにアーティファクトを含む質問を編集してください。

補足:Painting in AWT and Swing: Opacityも参照してください。

+0

コンポーネントバインドで定義された領域を完全にレンダリングしているかどうかを確認する方法を教えてください。とにかくsetOpaque(false)を試してみます;)私はJPanelのコンストラクタに入れていますか? – CTZStef

+0

OK setOpaque(false)で動作します! :Dありがとう、ゴミ箱...しかし、この魔法を私に説明してもらえますか? – CTZStef

+0

@CTZStef:上記のリンクを追加しました。たとえば、 '' ScrollPanePaint'(http://stackoverflow.com/a/3518047/230513)では 'MyPanel'はタイルを交互に塗りつぶすため、' opaque'は 'false'でなければなりません。 – trashgod

関連する問題