GridBagLayout不起作用
this.rootComponent.setLayout(new GridBagLayout()); GridBagConstraints gbc=new GridBagConstraints(); //gbc.gridwidth=2; gbc.gridx=0; gbc.gridy=0; gbc.gridwidth=8; gbc.anchor=GridBagConstraints.FIRST_LINE_START; this.rootComponent.add(new JLabel("Test label 1"),gbc); gbc.gridx=8; gbc.gridy=12; gbc.gridwidth=GridBagConstraints.REMAINDER; gbc.anchor=GridBagConstraints.FIRST_LINE_START; this.rootComponent.add(new JLabel("Test label"),gbc);
想要像这样格式化。 灰色部分显示jpanel部分。 最初我想正确布局前2个jpanel。 这是行不通的。 怎么解决?
您未能为GridBagConstraints
指定任何weightx
和weighty
值。 此外,您的gridwidth
值是错误的,因为对于最底部的JPanel
,它只需要为2
,其余的则需要为1
。
解释我在做什么:考虑JPanel
的BLUE
和RED
,它们将沿X-AXIS放置,比例为70:30
,相对于彼此(因此它们的weightx
x将分别为0.7
和0.3
。沿X-AXIS的总面积为1.0
)。
现在,这两个BLUE
和RED JPanel
都将沿着Y-AXIS放置,相对于第三个GREEN JPanel
,比例为90:10
,因此,这些BLUE
和RED
都将具有weighty = 0.9
和GREEN JPanel
将具有weighty = 0.1
,但由于GREEN JPanel
假设占据整个区域(相对于X-AXIS ),因此由BLUE
和RED JPanel
占用,就此而言,其gridwidth = 2
且weightx = 1.0
。
试试这个代码示例:
import java.awt.*; import javax.swing.*; public class GridBagLayoutExample { private GridBagConstraints gbc; public GridBagLayoutExample() { gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; } private void displayGUI() { JFrame frame = new JFrame("GridBagLayout Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel contentPane = getPanel(Color.WHITE); contentPane.setLayout(new GridBagLayout()); JPanel leftPanel = getPanel(Color.BLUE); JPanel rightPanel = getPanel(Color.RED); JPanel bottomPanel = getPanel(Color.GREEN.darker()); addComp(contentPane, leftPanel , 0, 0, 0.7, 0.9, 1, 1, GridBagConstraints.BOTH); addComp(contentPane, rightPanel , 1, 0, 0.3, 0.9, 1, 1, GridBagConstraints.BOTH); addComp(contentPane, bottomPanel , 0, 1, 1.0, 0.1, 2, 1, GridBagConstraints.BOTH); frame.setContentPane(contentPane); //frame.pack(); frame.setSize(300, 300); frame.setLocationByPlatform(true); frame.setVisible(true); } private void addComp(JPanel panel, JComponent comp , int gridX, int gridY , double weightX, double weightY , int gridWidth, int gridHeight, int fill) { gbc.gridx = gridX; gbc.gridy = gridY; gbc.weightx = weightX; gbc.weighty = weightY; gbc.gridwidth = gridWidth; gbc.gridheight = gridHeight; gbc.fill = fill; panel.add(comp, gbc); } private JPanel getPanel(Color backColour) { JPanel panel = new JPanel(); panel.setOpaque(true); panel.setBackground(backColour); panel.setBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5)); return panel; } public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { new GridBagLayoutExample().displayGUI(); } }; EventQueue.invokeLater(runnable); } }
这是相同的输出: