我正在尝试构建一个小型垄断游戏。在这里,您可以看到我遇到问题的代码部分。
public class Board extends JPanel {
private ImageIcon image;
private JLabel label;
static Player p1;
static Player p2;
public Board() {
p1 = new Player("Jack", 1);
p2 = new Player("Matt", 2);
setLayout(null);
image = new ImageIcon("board.jpg");
label = new JLabel(new ImageIcon("/Users/Onurcan/Documents/"
+ "workspace/Monopoly/src/board.jpg"));
add(p1.getToken());
add(label);
}
public class Monopoly {
public Monopoly() {
JFrame frame = new JFrame("Monopoly");
frame.setSize(1378, 900);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Board(), BorderLayout.WEST);
frame.setVisible(true);
}
}
正如你所猜测的,我在测试类中创建了一个新的Monopoly对象来运行这个程序。当我删除setLayout(null)时,我可以在程序中看到令牌和板。但如果不键入setLayout(null),我就无法将我的令牌移动到起点。在创建玩家时,如果第二个参数为1,则表示代币是一顶帽子,如果第三个参数为2,则表示它是一只鞋。所以我在问,我如何才能不失去视觉与setLayout(null)?或者如果布局设置为空,我如何更改我的代币位置?
实际上有两个是为了在容器上定位组件。
-
糟糕的方式。使用空布局并手动设置边界、大小或位置。这是一个非常糟糕的方法,因为现代用户界面并没有足够好地反映像素完美的东西。
-
定义适当的LayoutManager(或具有自己LayoutManager的多个嵌套面板)。因此,所有组件的尺寸/位置都是根据LayoutManager的规则计算的。
所以我在问,我怎么才能不失去视觉与
setLayout(null)
?
首先看一下"在容器中布置零部件"。布局管理API负责根据组件的实现来决定组件的大小和位置。
一旦您删除了它,您的组件就不知道应该如何调整大小或定位。事实上,默认情况下它是0x0x0x0。
布局管理是Swing API 的一个基本方面
如果不将布局设置为
null
,我如何更改我的代币位置?
简单的答案是调用组件上的setBounds
,并给它们一个大小和位置。这种方法充其量可能很麻烦,因为布局管理API是整个Swing API 的核心
更长的答案,也是我更喜欢的答案,是写一个布局管理器,它可以为你做出决定。了解每个玩家在棋盘上的位置,以及如何根据其配置将棋子最好地放置在棋盘上。