当前位置: 首页 > 知识库问答 >
问题:

使网格布局更紧凑

胡彭亮
2023-03-14

我试图通过GridBagLayout实现以下目标:

框架将接收一组“字段”(JLabel,JTextField对),我想以“网格状”的方式排列它们,其中一行将包含两个这样的对(JLabel1 JField1 JLabel2 JField2)。当一行包含这四个组件时,下一个组件将添加到另一行。

编辑:我希望组件从面板顶部开始

我的代码生成以下布局。我希望组件的布局更紧凑(尤其是垂直距离)

下面是代码:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Test extends JFrame{

private JPanel _panel;

public Test() {
    this.setDefaultCloseOperation(HIDE_ON_CLOSE);
    this.setResizable(true);
    this.setVisible(true);
    Dimension size = new Dimension(600,600);
    this.setMinimumSize(size);
    this.setSize(size);
    this.setPreferredSize(size);
    _panel = new JPanel();
    this.add(_panel);

}

public static void main(String[] args) {
    Test t = new Test();
    String[] labels = {"label1", "label2","label3","label4","label5"};
    String[] fieldValues = {"value1","value2","value3","value4","value5"};
    t.createFields(labels,fieldValues);
}

private void createFields(String[] labels, String[] fieldValues) {
    _panel.setLayout(new GridBagLayout());
    int col = 0;
    int row = -1;
    for(int i=0; i < labels.length;i++) {
        JLabel label = new JLabel(labels[i] + ":", JLabel.TRAILING);
        JTextField field = new JTextField(fieldValues[i]);
        Dimension size = new Dimension(200,30);
        field.setPreferredSize(size);
        label.setLabelFor(field);


        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weighty = 1;
        c.weightx = 1;
        c.ipadx = 0;
        c.ipady = 0;
        c.insets = new Insets(0,0,0,0);
        c.anchor = GridBagConstraints.LINE_START;
        c.gridx = col%4;
        if(i%2 == 0) row++;
        c.gridy = row;
        _panel.add(label,c);

        col++;
        c.gridx = col%4;
        _panel.add(field,c);
        col++;
    }

    this.setVisible(true);
}

共有2个答案

田博超
2023-03-14

如果你想让你的GUI达到这个尺寸,但是让组件紧凑,那么把它们放在自己的JPanel中,一个使用GridBagLayout的JPanel中,然后把这个JPanel添加到你的主GUI JPanel中。如果希望组件填充宽度,则使用主JPanel use BorderLayout,并使用JPanel BorderLayout添加GBL。北或北。不管你需要什么。

例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.*;

public class GridBagExample extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = PREF_W;

   public GridBagExample() {
      super(new BorderLayout());
      add(new GridBagUsingPanel(), BorderLayout.NORTH);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("GridBagExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new GridBagExample());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class GridBagUsingPanel extends JPanel {
   public static final int COLUMNS = 2;
   public static final int ROWS = 3;
   private static final int TF_COLS = 10;
   private static int inset = 5;
   private static final Insets INSETS = new Insets(inset, inset, inset, inset);
   private static final Insets EXTRA_INSETS = new Insets(inset, inset, inset, 8 * inset);
   private static final int EB_GAP = 10;

   public GridBagUsingPanel() {
      super(new GridBagLayout());
      setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, EB_GAP, EB_GAP));
      for (int r = 0; r < ROWS; r++) {
         for (int c = 0; c < COLUMNS; c++++) {
            addComponent(r, c);
         }
      }
   }

   private void addComponent(int r, int c) {
      int count = 1 + r * COLUMNS + c;
      JLabel label = new JLabel("label " + count);
      JTextField textField = new JTextField("value " + count, TF_COLS);

      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 2 * c;
      gbc.gridy = r;
      gbc.anchor = GridBagConstraints.WEST;
      gbc.fill = GridBagConstraints.BOTH;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.insets = INSETS;
      gbc.weightx = 0.1;
      gbc.weighty = 1.0;
      add(label, gbc);

      gbc.gridx++;
      gbc.anchor = GridBagConstraints.EAST;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.weightx = 1.0;
      if (c != COLUMNS - 1) {
         gbc.insets = EXTRA_INSETS;
      }
      add(textField, gbc);
   }

}
李景天
2023-03-14

如果你不介意你的元素在面板的中心(垂直和水平),然后移除

    c.weighty = 1;
    c.weightx = 1;

从你的代码。如果中心位置错误,请添加

    GridBagConstraints c = new GridBagConstraints();
    c.gridx=4;
    c.gridy=labels.length;
    c.weightx=1;
    c.weighty=1;
    _panel.add(new JLabel(),c);

在你的循环之后

 类似资料:
  • 主要内容:本节引言,1.相关属性总结图,2.使用实例:计算器布局的实现:,3.用法归纳:,4.使用GridLayout要注意的地方:,5.低版本sdk如何使用GridLayout:,本节小结本节引言 今天要介绍的布局是Android 4.0以后引入的一个新的布局,和前面所学的TableLayout(表格布局) 有点类似,不过他有很多前者没有的东西,也更加好用, 可以自己设置布局中组件的排列方式 可以自定义网格布局有多少行,多少列 可以直接设置组件位于某行某列 可以设置组件横跨几行或者几列 另外,

  • jQuery Mobile 提供了一套基于 CSS 的分列布局。然而,在移动设备上,由于考虑手机的屏幕宽度狭窄,一般不建议使用分栏分列布局。 但有时您想要将较小的元素(如按钮或导航标签)并排地排列在一起,就像是在一个表格中一样。这种情况下,推荐使用分列布局。 网格中的列是等宽的(合计是 100%),没有边框、背景、margin 或 padding。 这里有四种布局网格可供使用: 网格类:ui-gr

  • 今天要学的布局和上一节的 TableLayout 很类似,是在 Android 4.0 版本引入的布局方式。GridLayout 很有意思,自从引入之后在 Android 开发圈有以下特点: 大部分的开发者可能都不知道有这个布局方式的存在; 有些开发者虽然知道,但是很多时候不会去使用这个布局方式; 很少的开发者会花时间研究这个布局方式,也不会灵活的使用; 之所以会花一个章节来讲,是希望大家能够引起

  • 因为屏幕通常都比较窄,所以使用多栏布局的方法在移动设备上不是推荐的方法。但是总有时候你会想要把一些小的元素并排放置(比如按钮,或导航标签) Jquery Mobile框架提供了一种简单的方法构建基于css的分栏布局,叫做ui-grid Jquery Mobile提供了两种预设的配置布局:两列布局(class 含有 ui-grid-a)和三列布局 (class 含有 ui-grid-b)—几乎可满足

  • 问题内容: 范例GUI大家好,我有 问题。如果有人可以帮助,那就太好了。我正在使用border和 gridlayout,并且试图拆分GUI,但是这没有发生,因为我希望 按钮占整体的一小部分,可以说是1/5,但目前 超过了GUI的一半。我也尝试将按钮放在尺寸上, 但是我不确定这是否是一个好习惯。我有两个类,一个是 RunFurniture,它是框架的主要方法,另一个是 GUI的PanelFurnit

  • 我有一个小问题。我试图用JavaFX2.0创建一个好的GUI(可以调整大小),但我有一个小问题。我使用的是网格窗格,但当我在其中放置多个按钮时,当我将屏幕大小调整为较小尺寸时,按钮将以屏幕左侧的大小相互滑动。我可以为单元格或其他东西设置最小大小吗?我正在使用FXML进行设计。非常感谢你!