0

わかりましたので、Tile というクラスを作成しました。このクラスは JLabel を拡張します。

public Tile()
{
    super();
}

JLabel と同じように動作するはずですよね? しかし、コードで使用しようとすると、正しい位置に表示されません。タイルの境界を呼び出すと、期待どおりの結果が得られますが、その位置ではありません。 http://puu.sh/58eUg.jpgを使用したタイル、http: //puu.sh/58eVT.png を使用した場合は、Tile が呼び出された場所で JLabel を使用しました。

Container cPane = getContentPane();

    for(int x = 0;x<8;x++)
    {
        for(int y = 0;y<8;y++)
        {
            grid[x][y] = new Tile();
            grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black));
            grid[x][y].setBounds(50*x,50*y,100,100);
            getContentPane().add(grid[x][y]);
            cPane.add(grid[x][y]);
        }
    }

どんな助けでも大歓迎です。

4

1 に答える 1

5

あはは、あなたの質問に対する私のコメントは正しかった -

推測させてください: メソッドがオーバーライドであることを認識せずに getX() および getY() メソッドをオーバーライドしたのではないでしょうか? ...

getX()実際にはandをオーバーライドしていますgetY()。これらのメソッドは、レイアウト マネージャと GUI がコンポーネントの位置を設定するために使用する JComponent の主要なメソッドです。オーバーライドすると、GUI でのコンポーネントの動作が完全に台無しになります。

これは、必要でない限り、コンポーネントのような複雑なクラスを拡張しないようにする 1 つの理由です。継承よりも構成を優先します。

たとえば、小さなファクトリ メソッドを作成してタイル/JLabels を作成し、GUI のすべての機能を保持する非 GUI モデル クラスでコンポーネントをバックアップできます。この例は、Conway の Game of Life のようなもので、論理グリッド LifeSquares と、論理グリッドの「ビュー」にすぎず、次のようなユーザー インタラクションを渡すための配線を備えた別の GUI が存在します。マウスは「コントロール」クラスを押します。

于 2013-11-04T03:36:39.463 に答える