2016-11-03 65 views
0

使用GridBagLayout来放置面板如下。我想把所有东西都放在最上面。我可以用BorderLayout.NORTH我backgroundpanel(JP),但管理此则backgroundpanel犯规利用的GridBagLayout填满窗口使用GridBagLayout将内容与顶部对齐

我该如何调整我的面板顶端?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test extends JFrame { 

    JPanel jp = new JPanel(); 
    JPanel jp1 = new JPanel(); 
    JPanel jp2 = new JPanel(); 
    JPanel jp3 = new JPanel(); 
    JPanel jp4 = new JPanel(); 

    public Test() { 
     jp1.setPreferredSize(new Dimension(100, 100)); 
     jp2.setPreferredSize(new Dimension(100, 100)); 
     jp3.setPreferredSize(new Dimension(100, 100)); 
     jp4.setPreferredSize(new Dimension(100, 100)); 

     jp1.setBackground(Color.red); 
     jp2.setBackground(Color.blue); 
     jp3.setBackground(Color.yellow); 
     jp4.setBackground(Color.green); 

     GridBagLayout g = new GridBagLayout(); 
     jp.setLayout(g); 
     jp.setBackground(Color.BLACK); 

     GridBagConstraints con; 
     con = new GridBagConstraints(); 
     con.insets = new Insets(3, 3, 3, 3); // top, left, bottom, right 

     // PANEL ONE 
     con.gridx = 0; 
     con.gridy = 0; 
     g.setConstraints(jp1, con); 
     jp.add(jp1); 

     // PANEL TWO 
     con.gridx = 1; 
     con.gridy = 0; 
     g.setConstraints(jp2, con); 
     jp.add(jp2); 

     // PANEL THREE 
     con.gridx = 0; 
     con.gridy = 1; 
     g.setConstraints(jp3, con); 
     jp.add(jp3); 

     // PANEL FOUR 
     con.gridx = 1; 
     con.gridy = 1; 
     g.setConstraints(jp4, con); 
     jp.add(jp4); 

     this.setSize(600, 300); 
     // I CAN MANAGE TO GET THE PANELS ALIGNED TO THE TOP BY USING BORDERLAYOUT 
     // LIKE BELOW BUT THEN THE BACKGROUNDPANEL DOESNT FILL THE WINDOW 
     // this.add(jp, BorderLayout.NORTH); 

     this.add(jp); 
    } 

    public static void main(String[] args) { 
     new Test().setVisible(true); 
    } 
} 

回答

2

但随后backgroundpanel犯规填补

你为什么希望backgroundPanel填补了窗口的窗口?

如果你只是想要一个黑色的背景,那么你可以这样做:

//this.add(jp); 
this.getContentPane().setBackground(jp.getBackground()); 
this.add(jp, BorderLayout.NORTH); 

或者使用GridBagLayout的时候,你需要指定“锚”和“沉重”约束上:

con.gridx = 0; 
con.gridy = 0; 
con.anchor = ...; 

... 

con.gridx = 1; 
con.gridy = 1; 
con.weighty = ...; 

阅读了解Swing教程How to Use GridBagLayout中的部分,以了解这些约束所做的事情。我已经指出了您需要使用哪些限制以及将它们包含在您的示例中。

另一种方法是使用包装板:

JPanel wrapper = new JPanel(); 
wrapper.setBackground(Color.BLACK); 
wrapper.add(jp); 
this.add(wrapper); 

缺省情况下一个JPanel使用的FlowLayout将尊重添加到面板的任何组件的大小。