在将addind Jpanel添加到Jpanel之后,Java Swing repaint(),revalidate()问题

时间:2017-01-08 10:19:02

标签: java swing

我是java的新手,我正在尝试创建自己的拼字游戏。我创建了自己的类Board和Tile两个JPanels。当我在我的董事会上绘制瓷砖时:

Tile tile = new Tile(currentlyChosenLetter, jump);
board.add(tile);
tile.setBounds(x * jump + 1, y * jump + 1, jump - 2, jump - 2);

当我这样做时,一切似乎都很好:

Without repaint

但添加后:

board.revalidate();
board.repaint();

瓷砖放错了地方,我需要在去除瓷砖的情况下重新粉刷。

WithRepaint

x和y我从鼠标位置开始:

int jump = board.getHeight() / 15;
int x = (e.getX() / jump);
int y = (e.getY() / jump);

其中e是MouseEvent。

1 个答案:

答案 0 :(得分:1)

board.revalidate();
board.repaint();

revalidate()语句调用布局管理器,以便根据布局管理器的规则为子组件指定大小和位置。 JPanel的默认布局管理器是FlowLayout,因此组件显示在一行上。

所以不要使用setBounds(...)。而是使用像GridLayout这样的适当布局管理器,并将组件添加到网格的每个方格。

我建议您可能希望每个网格JLabel。然后,您可以使用给定方块的默认图标为每个标签添加Icon。然后,当添加一个字母时,用文本替换Icon。