【问题标题】:java swing GridBagLayout space leftjava swing GridBagLayout 剩余空间
【发布时间】:2011-06-17 20:47:19
【问题描述】:

我被 java GridBagLayout 卡住了。这里只剩下一个问题了。我希望中间面板(“测试标签 2”)保留所有垂直空间。

如何做到这一点?

谢谢。

 package com;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class Test1 {
    private void _panel1(JPanel panel){
        panel.setBorder(new LineBorder(Color.RED));

        panel.setLayout(new GridBagLayout());

        JPanel panel1 = new JPanel();
        panel1.add(new JLabel(" Testing Label 1 "));

        panel1.setBorder(new TitledBorder("P1"));
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.NORTH;
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1.0;
        c.weighty = 0.0;    

        panel.add(panel1, c);

        JPanel panel2 = new JPanel();
        panel2.add(new JLabel(" Testing Label 2"));

        panel2.setBorder(new TitledBorder("P2"));
        c = new GridBagConstraints();   
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.NORTH;
        c.gridx = 0;
        c.gridy = 1;    
        c.weightx = 1.0;
        c.weighty = 1.0;        

        panel.add(panel2, c);

        JPanel panel3 = new JPanel();
        panel3.setBorder(new TitledBorder("P3"));
        c = new GridBagConstraints();   
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.NORTH;
        c.gridx = 0;
        c.gridy = 2;    
        c.weightx = 1.0;
        c.weighty = 0.0;

        panel3.setLayout(new GridLayout(5,1));
        for(int i=0; i<5; i++){
            panel3.add(new JButton("button "+i));
        }

        panel.add(panel3, c);   
    }
    public Test1(){
        JFrame frame = new JFrame();
        frame.setTitle("test 1");
        frame.getContentPane().setLayout(new GridLayout(1,3));

        JPanel panel1 = new JPanel();
        _panel1(panel1);

        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();

        frame.getContentPane().add(panel1);
        frame.getContentPane().add(panel2);
        frame.getContentPane().add(panel3);

        frame.setSize(800, 600);
        frame.setVisible(true);     
    }

    public static void main(String[] args) {
        Test1 t = new Test1();
    }

}

【问题讨论】:

  • 查看插图是否需要额外的填充空间 VERTICAL/BOTH,如果组件必须占用所有空间
  • @bestsss:我不认为这是正确的。 Insets 不会使组件填充空间,而是在组件周围放置一个空边框,边框的大小由传递给 Insets 构造函数的参数决定。最好更改 GridBagConstraint 的填充字段。请参阅我的帖子以获取示例。
  • @Hovercraft Full Of Eels, of = after, sry
  • @bestsss:请澄清您的最新评论。
  • @Hovercraft Full Of Eels,第一条评论是:look at insets if you need extra space *after* fill VERTICAL/BOTH

标签: java swing gridbaglayout


【解决方案1】:

我只改了一行(27):

    final JPanel panel2 = new JPanel();
    panel2.add(new JLabel(" Testing Label 2"));

    panel2.setBorder(new TitledBorder("P2"));
    c = new GridBagConstraints();
    // You have to use BOTH for the panel to take
    // all vertical and horizontal space
    c.fill = GridBagConstraints.BOTH;

您将panel2 的网格约束设置为HORIZONTAL

问候,

【讨论】:

    【解决方案2】:

    考虑将 GridBagConstraint 的填充字段更改为 panel2 的 BOTH:

      panel2.setBorder(new TitledBorder("P2"));
      c = new GridBagConstraints();
      c.fill = GridBagConstraints.BOTH; // *****
      c.anchor = GridBagConstraints.NORTH;
    

    无论是这样还是更简单的解决方案,只需使用 BorderLayout 代替:

      panel.setBorder(new LineBorder(Color.RED));
    
      panel.setLayout(new BorderLayout());
    
      JPanel panel1 = new JPanel();
      panel1.add(new JLabel(" Testing Label 1 "));
    
      panel1.setBorder(new TitledBorder("P1"));
      panel.add(panel1, BorderLayout.NORTH);
    
      JPanel panel2 = new JPanel();
      panel2.add(new JLabel(" Testing Label 2"));
    
      panel2.setBorder(new TitledBorder("P2"));
    
      panel.add(panel2, BorderLayout.CENTER);
    
      JPanel panel3 = new JPanel();
      panel3.setBorder(new TitledBorder("P3"));
    
      panel3.setLayout(new GridLayout(5, 1));
      for (int i = 0; i < 5; i++) {
         panel3.add(new JButton("button " + i));
      }
    
      panel.add(panel3, BorderLayout.SOUTH);
    

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多