在框布局中设置组件的自定义位置

时间:2016-03-25 19:58:00

标签: java swing layout-manager boxlayout

我有一个框架,在这个框架内我有一个带有框布局的面板,在这个面板内我还有4个面板。

        mainFrame = new JFrame("Basket Game");
        mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        mainPanel.add(options);
        mainPanel.add(pname);
        mainPanel.add(info);
        mainPanel.add(gamearea);    

    mainFrame.setContentPane(mainPanel);
    mainFrame.pack();
    mainFrame.getContentPane().setBackground(Color.LIGHT_GRAY);
    mainFrame.setResizable(false);
    mainFrame.setVisible(true);
    mainFrame.setSize(600,600);

表格如下:

form

前三个面板对我来说没问题。但是对于最后一个面板(黑色面板),我想添加一些带有自定义坐标的组件。但是当我尝试使用自定义坐标添加它们时:

basket.setLocation(500, 500);
gamearea.add(basket);

它直接位于面板的顶部中心(坐标不会影响它的位置)

second

当我将gameareI的布局设置为null时,我无法在面板上看到我的标签。我想我应该为此做一些额外的事情。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

问题不在于您的布局管理器(null),也没有遗漏任何问题。问题只是500x500超出game area的范围。

public class NullLayout {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(NullLayout::new);
    }

    NullLayout() {
        JFrame frame = new JFrame("Basket Game");
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        for (int i = 0; i < 4; i++) {
            JPanel strip = new JPanel();
            strip.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50));
            strip.setBorder(BorderFactory.createTitledBorder("Strip " + i));
            strip.add(new JLabel("Strip " + i));
            mainPanel.add(strip);
        }

        JPanel gamearea = new JPanel();
        gamearea.setLayout(null);
        mainPanel.add(gamearea);

        for (int i = 0; i < 5; i++) {
            int x = i * 100, y = i * 100;
            JPanel basket = new JPanel();
            basket.setSize(200, 50);
            basket.setLocation(x, y);
            basket.setBackground(Color.YELLOW);
            basket.add(new JLabel("x = " + x + ", y = " + y));
            gamearea.add(basket);
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(mainPanel);
        frame.pack();
        frame.setResizable(false);
        frame.setSize(600, 600);

        frame.setVisible(true);
    }
}

Basket showing (0,0), to (300,300), but not (400,400)

请注意,{400}处的Basket未显示;它会离开游戏区域的底部。

答案 1 :(得分:0)

使用null布局几乎总是错误的。您应该使用LayoutManager来帮助将组件放在您想要的位置 - 如果用户改变主框架的大小,这将非常有用。使用GridBag或Mig布局。

如果您绝对坚持使用null布局,请创建一个扩展JPanel的新GameArea类,覆盖其paintComponent()方法并使用child.setBounds(...)设置子位置。确保重写方法中的第一个语句是super.paintComponent(g);