如何使用 GridBagLayout 将组件拉伸到多列?
How do I stretch a component over multiple columns using GridBagLayout?
我一直在学习 Java Swing 中的布局,目前正在制作一个简单的计算器。我将为 input/output 使用一个文本字段,我想将它拉伸超过 2 列(我总共使用了三列)但是当我尝试拉伸它时,它会调整第一列中项目的大小。这是代码和屏幕截图。
应用截图:
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.*;
public class Calculator extends JFrame{
JButton but1, but2, but3, but4, but5, but6,
but7, but8, but9, but0, butPlus, butMinus,
clearAll;
JTextField textResult;
int num1, num2;
public static void main(String[] args){
new Calculator();
}
public Calculator(){
this.setSize(400,400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Calculator");
JPanel thePanel = new JPanel();
thePanel.setLayout(new GridBagLayout());
GridBagConstraints gridConstraints = new GridBagConstraints();
gridConstraints.gridx = 0;
gridConstraints.gridy = 0;
gridConstraints.gridwidth = 1;
gridConstraints.gridheight = 1;
gridConstraints.weightx = 50;
gridConstraints.weighty = 100;
gridConstraints.insets = new Insets(5, 5, 5, 5);
gridConstraints.anchor = GridBagConstraints.CENTER;
gridConstraints.fill = GridBagConstraints.BOTH;
textResult = new JTextField("0", 20);
Font font = new Font("Helvetica", Font.PLAIN, 18);
textResult.setFont(font);
but1 = new JButton("1");
but2 = new JButton("2");
but3 = new JButton("3");
but4 = new JButton("4");
but5 = new JButton("5");
but6 = new JButton("6");
but7 = new JButton("7");
but8 = new JButton("8");
but9 = new JButton("9");
butPlus = new JButton("+");
but0 = new JButton("0");
butMinus = new JButton("-");
clearAll = new JButton("C");
thePanel.add(clearAll, gridConstraints);
gridConstraints.gridx = 1;
gridConstraints.gridwidth = 2;
thePanel.add(textResult, gridConstraints);
gridConstraints.gridwidth = 1;
gridConstraints.gridx = 0;
gridConstraints.gridy = 1;
thePanel.add(but1, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but2, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but3, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 2;
thePanel.add(but4, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but5, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but6, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 3;
thePanel.add(but7, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but8, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but9, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 4;
thePanel.add(butPlus, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but0, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(butMinus, gridConstraints);
this.add(thePanel);
this.setVisible(true);
}
}
注:
Swing offsets/indexes 从 0 开始。
通常当人们使用 GridBagLayout 时,gridx/gridy 会从 0 开始。
但是,我看到您使用的 gridx/gridy 的起始值为 1。这应该可行。这只是意味着第 0 列和第 0 行的大小为 0。
为了与大多数人使用 GridBagLayout 的方式保持一致,您可能需要更改代码以使用 0 作为 gridx/gridy 的起始偏移量。
我的以下建议假定您将代码转换为使用 0 作为网格的偏移量。
gridConstraints.gridx = 5;
gridConstraints.gridwidth = 20;
thePanel.add(textResult, gridConstraints);
您只有 3 列。你不能随便给一个组件:
- 一个5的gridx,它只能是0,1,2。在这种情况下你想要1
- 网格宽度为20,只能是1、2、3,本例需要2。
如果您保留 1 作为起始网格偏移量,那么您需要使用 2 作为 gridx。
编辑:
it resizes items in the first column
我认为问题如下:
textResult = new JTextField("0", 20);
20 告诉文本字段自行调整大小以显示 20 个“W”字符(这使得文本字段相对于按钮较大。
因此,第 1 列和第 2 列中的按钮将是文本字段大小的一半。
也许试试:
textResult = new JTextField("0", 10);
看看有没有更好的。
或者更好的选择是使用:
textResult = new JTextField("0");
现在文本字段的大小将由按钮的大小控制。
换行
textResult = new JTextField("0", 20);
至
textResult = new JTextField("0");
问题是您的文本字段的最小宽度大于 2 列的总和,因此它拉伸了 2 列,从而拉伸了其他所有内容。
我一直在学习 Java Swing 中的布局,目前正在制作一个简单的计算器。我将为 input/output 使用一个文本字段,我想将它拉伸超过 2 列(我总共使用了三列)但是当我尝试拉伸它时,它会调整第一列中项目的大小。这是代码和屏幕截图。
应用截图:
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.*;
public class Calculator extends JFrame{
JButton but1, but2, but3, but4, but5, but6,
but7, but8, but9, but0, butPlus, butMinus,
clearAll;
JTextField textResult;
int num1, num2;
public static void main(String[] args){
new Calculator();
}
public Calculator(){
this.setSize(400,400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Calculator");
JPanel thePanel = new JPanel();
thePanel.setLayout(new GridBagLayout());
GridBagConstraints gridConstraints = new GridBagConstraints();
gridConstraints.gridx = 0;
gridConstraints.gridy = 0;
gridConstraints.gridwidth = 1;
gridConstraints.gridheight = 1;
gridConstraints.weightx = 50;
gridConstraints.weighty = 100;
gridConstraints.insets = new Insets(5, 5, 5, 5);
gridConstraints.anchor = GridBagConstraints.CENTER;
gridConstraints.fill = GridBagConstraints.BOTH;
textResult = new JTextField("0", 20);
Font font = new Font("Helvetica", Font.PLAIN, 18);
textResult.setFont(font);
but1 = new JButton("1");
but2 = new JButton("2");
but3 = new JButton("3");
but4 = new JButton("4");
but5 = new JButton("5");
but6 = new JButton("6");
but7 = new JButton("7");
but8 = new JButton("8");
but9 = new JButton("9");
butPlus = new JButton("+");
but0 = new JButton("0");
butMinus = new JButton("-");
clearAll = new JButton("C");
thePanel.add(clearAll, gridConstraints);
gridConstraints.gridx = 1;
gridConstraints.gridwidth = 2;
thePanel.add(textResult, gridConstraints);
gridConstraints.gridwidth = 1;
gridConstraints.gridx = 0;
gridConstraints.gridy = 1;
thePanel.add(but1, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but2, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but3, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 2;
thePanel.add(but4, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but5, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but6, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 3;
thePanel.add(but7, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but8, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(but9, gridConstraints);
gridConstraints.gridx = 0;
gridConstraints.gridy = 4;
thePanel.add(butPlus, gridConstraints);
gridConstraints.gridx = 1;
thePanel.add(but0, gridConstraints);
gridConstraints.gridx = 2;
thePanel.add(butMinus, gridConstraints);
this.add(thePanel);
this.setVisible(true);
}
}
注:
Swing offsets/indexes 从 0 开始。
通常当人们使用 GridBagLayout 时,gridx/gridy 会从 0 开始。
但是,我看到您使用的 gridx/gridy 的起始值为 1。这应该可行。这只是意味着第 0 列和第 0 行的大小为 0。
为了与大多数人使用 GridBagLayout 的方式保持一致,您可能需要更改代码以使用 0 作为 gridx/gridy 的起始偏移量。
我的以下建议假定您将代码转换为使用 0 作为网格的偏移量。
gridConstraints.gridx = 5;
gridConstraints.gridwidth = 20;
thePanel.add(textResult, gridConstraints);
您只有 3 列。你不能随便给一个组件:
- 一个5的gridx,它只能是0,1,2。在这种情况下你想要1
- 网格宽度为20,只能是1、2、3,本例需要2。
如果您保留 1 作为起始网格偏移量,那么您需要使用 2 作为 gridx。
编辑:
it resizes items in the first column
我认为问题如下:
textResult = new JTextField("0", 20);
20 告诉文本字段自行调整大小以显示 20 个“W”字符(这使得文本字段相对于按钮较大。
因此,第 1 列和第 2 列中的按钮将是文本字段大小的一半。
也许试试:
textResult = new JTextField("0", 10);
看看有没有更好的。
或者更好的选择是使用:
textResult = new JTextField("0");
现在文本字段的大小将由按钮的大小控制。
换行
textResult = new JTextField("0", 20);
至
textResult = new JTextField("0");
问题是您的文本字段的最小宽度大于 2 列的总和,因此它拉伸了 2 列,从而拉伸了其他所有内容。