2016-11-03 39 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將尊重添加到面板的任何組件的大小。