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

时间:2015-04-09 05:51:38

标签: java swing layout layout-manager null-layout-manager

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

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)丢失视觉效果?或者,如果将布局设置为null,我该如何更改我的标记位置?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

  

所以我问我怎样才不会失去setLayout(null)的视觉效果?

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

删除此部件后,您的组件不知道它的大小或位置。实际上,默认情况下它是0x0x0x0。

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

  

没有将布局设置为null如何更改我的代币位置?

嗯,简短的回答是在组件上调用setBounds并给它们一个大小和位置。这种方法充其量也很麻烦,因为布局管理API对整个Swing API来说都很重要

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