1

私は3つのクラスを持っているので、私は素晴らしい問題を抱えています:

  1. WindowFrame-そのクラスはJFrameを拡張し、内部のパネルの1つを表示します。
  2. WindowPanel-JPanelを拡張するクラスです。そこにレイアウトBoxLayoutがあります。WindowFrameの他のパネルを切り替えたい。
  3. GButton-通常のボタンのようなクラスですが、bgにテクスチャがあり、add()を使用してWindowPanelに簡単に追加したいと考えています。

public class GButton extends JComponent implements MouseMotionListener, MouseListener{

    int x, y , w, h; //the coordinates of button
    Graphics2D g2d;

    public GButton(int x, int y){
        this.x = x; this.y = y;
        this.w = 200; this.h = 100;
        ... //add listeners, loading some information etc
    }

    @Override
    public void paintComponent(Graphics g){
        g2d = (Graphics2D) g;
        ...//loading and draw on g2d
        g2d.drawString("asidoaisjdiajsoidj",x,y);
    }

    //code with using events of mouse and so on
}

そして、ボタンを追加すると、ボタンのテクスチャはyの下50pxになります!次のボタンは、yとのこの違いを大きくしました。なんで?私はヘルプMouseMoveイベントでそれをチェックするのでそれを知っています。画像のサイズなどは悪くありません。なぜそれが機能しないのですか、そしてそれは他の場所で物事をペイントしますか?同じ効果を得る簡単な方法はありますか?お答えください :)

4

2 に答える 2

1

ただし、地上では少し薄くコーディングします。

  • Graphicsコンテキストへの参照を維持しないでください。1. 再利用されます。2. 塗装サイクル間で変更される場合があります。コンポーネントに渡されたグラフィック コンテキストにペイントする必要があります。
  • に電話する必要がありますsuper.paintComponent。これは非常に重要です。

100% 確信はできませんが、ボタンが画面に表示される x/y 位置にペイントする必要があるという印象を受けているようですが、これは正しくありません。Graphics位置 0x0 がオブジェクトの左上隅になるように、コンテキストは既に変換されています。

時間をかけて読み進める必要があることをお勧めします

于 2012-11-25T03:18:33.033 に答える
0

Graphics(および2D)へのグローバル参照を保持しないでください。

必要に応じg2d.dispose()て、各図面の最後で呼び出し、次に使用するときに新しいグラフィカルコンテキストを取得します。

于 2012-11-25T01:19:02.647 に答える