为什么我在添加 setLayout(null) 时失去视觉效果?

Why I lost visual when I add 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);
    }   
}

如您所料,我在 class 到 运行 这个程序的测试中创建了一个新的 Monopoly 对象。当我删除 setLayout(null) 时,我可以在程序中看到令牌和板。但是如果不输入 setLayout(null) 我就无法将令牌移动到起点。在创建玩家时,如果第二个参数为 1,则表示 token 是帽子,如果第二个参数为 2,则表示它是鞋子。所以我问我怎样才能不丢失 setLayout(null) 的视觉效果?或者如果不将布局设置为空,我该如何更改我的令牌位置?

So I am asking that how can I do not lose visual with setLayout(null)?

先看看 Laying Out Components Within a Container。布局管理 API 负责根据组件的实现决定组件的大小和位置。

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

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

without setting layout to null how can I change my tokens position?

嗯,简短的回答是对组件调用 setBounds 并为它们指定大小和位置。这种方法充其量也可能很麻烦,因为布局管理 API 是整个 Swing 的核心 API

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

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

  1. 方法不对。使用空布局并手动设置边界或大小或位置。这是非常糟糕的方法,因为现代 UI 不应该足够好地反映像素完美的东西。

  2. 定义适当的 LayoutManager(或具有自己的 LayoutManager 的多个嵌套面板)。这样所有的组件sizes/position都是按照LayoutManager的规则计算出来的