2016-03-25 181 views
1

我有一个框架,在这个框架内我有一个面板与框布局,在这个面板内我有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

第3面板是确定适合我。但对于最后一个面板(黑色),我想添加一些具有自定义坐标的组件。但是,当我尝试将其与自定义添加坐标:

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

是不言而喻的面板直接顶中心(坐标并不影响它的位置)

second

当我设置gameareI小号布局到null我看不到面板上的我的标签。我想我应该为它做点额外的事情。我怎样才能做到这一点?

+0

您的主窗口只有600x600。通过标题栏,选项,播放器名称和信息,y = 500可能低于窗格的底部。 – AJNeufeld

+0

您是否了解布局管理器的工作原理?你了解布局经理的责任吗?你是否了解API重置与布局管理器交互的人员?如果你不这样做,那么空的布局不是你正在寻找的选择。在几乎所有情况下,当你认为你想要一个空的布局时,你可能不需要。在这些罕见的情况下,空布局可能会有用,自定义布局会导致更少的问题和返工 – MadProgrammer

回答

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)

注意,在Basket 400400没有显示;它会离开游戏区域的底部。

0

使用空布局几乎总是错误的。您应该使用LayoutManager来帮助将组件放置在您想要的位置 - 如果用户更改主框架的大小,该选项尤其有用。使用GridBag或Mig布局。

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

+0

肯定允许使用'null'布局。请参阅https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html – AJNeufeld

+0

此外,用户无法更改窗口的大小,因为调用了“mainFrame.setResizable(false);' 。 – AJNeufeld

+0

@AJNeufeld它可能是“允许的”,但它非常令人沮丧,任何时候你可能认为你需要它,你可能不会。整个Swing API都是围绕布局API编写的,放弃将大量责任推给开发人员,而大多数人还没有准备好处理它。 – MadProgrammer

相关问题