0

好的,所以我创建了一个名为 Tile 的类。这个类扩展了 JLabel。

public Tile()
{
    super();
}

行为应该与 JLabel 相同,不是吗?但是当我尝试在我的代码中使用它时,它没有显示在正确的位置。如果我调用 Tile 的边界,它会给出我所期望的,但它不在那个位置。 http://puu.sh/58eUg.jpg使用瓷砖,http ://puu.sh/58eVT.png如果我在调用瓷砖的地方使用 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 上的行为将完全混乱。

这是避免扩展复杂类(如组件)的原因之一,除非必要。优先组合而不是继承。

例如,您可以创建一个小工厂方法来创建您的 tile/JLabels,并且您可以使用包含 GUI 的所有智能的非 GUI 模型类来支持组件。这方面的一个例子是像康威的生命游戏,其中存在一个逻辑网格 LifeSquares 以及一个单独的 GUI,它只不过是逻辑网格的“视图”,并且具有传递用户交互的布线,例如鼠标按下“控制”类。

于 2013-11-04T03:36:39.463 回答