我有一个框架,在这个框架内我有一个带有框布局的面板,在这个面板内我还有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);
表格如下:
前三个面板对我来说没问题。但是对于最后一个面板(黑色面板),我想添加一些带有自定义坐标的组件。但是当我尝试使用自定义坐标添加它们时:
basket.setLocation(500, 500);
gamearea.add(basket);
它直接位于面板的顶部中心(坐标不会影响它的位置)
当我将gameareI
的布局设置为null
时,我无法在面板上看到我的标签。我想我应该为此做一些额外的事情。我怎么能这样做?
答案 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);
}
}
请注意,{400}处的Basket
未显示;它会离开游戏区域的底部。
答案 1 :(得分:0)
使用null布局几乎总是错误的。您应该使用LayoutManager来帮助将组件放在您想要的位置 - 如果用户改变主框架的大小,这将非常有用。使用GridBag或Mig布局。
如果您绝对坚持使用null布局,请创建一个扩展JPanel的新GameArea类,覆盖其paintComponent()方法并使用child.setBounds(...)设置子位置。确保重写方法中的第一个语句是super.paintComponent(g);
。