为什么我添加setLayout(null)时丢失了视觉效果



我正在尝试构建一个小型垄断游戏。在这里,您可以看到我遇到问题的代码部分。

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)?或者如果布局设置为空,我如何更改我的代币位置?

实际上有两个是为了在容器上定位组件。

  1. 糟糕的方式。使用空布局并手动设置边界、大小或位置。这是一个非常糟糕的方法,因为现代用户界面并没有足够好地反映像素完美的东西。

  2. 定义适当的LayoutManager(或具有自己LayoutManager的多个嵌套面板)。因此,所有组件的尺寸/位置都是根据LayoutManager的规则计算的。

所以我在问,我怎么才能不失去视觉与setLayout(null)

首先看一下"在容器中布置零部件"。布局管理API负责根据组件的实现来决定组件的大小和位置。

一旦您删除了它,您的组件就不知道应该如何调整大小或定位。事实上,默认情况下它是0x0x0x0。

布局管理是Swing API 的一个基本方面

如果不将布局设置为null,我如何更改我的代币位置?

简单的答案是调用组件上的setBounds,并给它们一个大小和位置。这种方法充其量可能很麻烦,因为布局管理API是整个Swing API 的核心

更长的答案,也是我更喜欢的答案,是写一个布局管理器,它可以为你做出决定。了解每个玩家在棋盘上的位置,以及如何根据其配置将棋子最好地放置在棋盘上。

最新更新