GridBagLayout 向列添加额外的 space
GridBagLayout adding extra space to column
我有一个 JPanel
和 GridBagLayout
作为布局管理器,我正在尝试这样安排:
忽略边框多余的深蓝色space。
我总共有 5 列和 3 行,所有组件都将 setPreferredSize()
设置为精确值以完全适合 JPanel
,它也有一个首选大小 (170 x 115) .
问题是 GridBagLayout
似乎在最后一列的宽度上增加了 30 像素,因为仅在 JPanel
的宽度上增加了 30 像素(总共 200 个)显示了组件正确的,像这样:
但由于额外的 space.
而将最后一列分开
它添加了 30 像素,因为将 29 像素添加到 JPanel 的宽度会得到以下结果:
根据我的经验,可用的 space 太小而无法显示所有组件,然后使用 setMinimumSize()
.
我不知道那 30 像素是从哪里来的,请问谁能告诉我如何让组件合适?
代码如下所示,目前给出了这个结果:
忽略 JFrame
的额外黑色 space。
您可以在第 34 行更改 JPanel
的宽度。
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class Test{
public static void main (String[] args){
JFrame f;
SizeProperties p;
f = new JFrame();
p = new SizeProperties();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(250,200));
f.getContentPane().setBackground(Color.BLACK);
f.setLayout(new FlowLayout());
f.add(p);
f.pack();
f.setVisible(true);
}
}
final class SizeProperties extends JPanel{
private GridBagConstraints c;
private PropertiesLabel xL,yL,wL,hL;
private PropertiesField xF,yF,wF,hF;
private ProportionToggleButton ptb;
SizeProperties(){
setBackground(new Color(18,101,142));
setPreferredSize(new Dimension(170,115));//Change width here
setLayout(new GridBagLayout());
xL = new PropertiesLabel("x:",25,25);
xF = new PropertiesField();
yL = new PropertiesLabel("y:",25,25);
yF = new PropertiesField();
wL = new PropertiesLabel("Width:",80,25);
wF = new PropertiesField();
hL = new PropertiesLabel("Height:",80,25);
hF = new PropertiesField();
ptb = new ProportionToggleButton();
c = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,0),0,0);
add(xL,c);
c = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(xF,c);
c = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,0),0,0);
add(yL,c);
c = new GridBagConstraints(3,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(yF,c);
c = new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(wL,c);
c = new GridBagConstraints(2,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(wF,c);
c = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(hL,c);
c = new GridBagConstraints(2,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(hF,c);
c = new GridBagConstraints(4,1,1,2,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(ptb,c);
}
}
final class PropertiesLabel extends JLabel{
PropertiesLabel(String label,int w,int h){
setText(label);
setPreferredSize(new Dimension(w,h));
setBackground(Color.BLACK);
setOpaque(true);
setForeground(Color.WHITE);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(SwingConstants.CENTER);
setVerticalAlignment(SwingConstants.CENTER);
}
}
final class PropertiesField extends JTextField{
private int validNumber = 0;
PropertiesField(){
setPreferredSize(new Dimension(45,25));
setBackground(new Color(202,226,255));
setForeground(Color.BLACK);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(JTextField.CENTER);
setText("999");
}
}
final class ProportionToggleButton extends JToggleButton{
ProportionToggleButton(){
setPreferredSize(new Dimension(15,60));
}
}
提前致谢。
I have in total 5 columns
据我所知不是。您不能只将组件分配给列。实际上,您需要在一行中包含 5 个组件才能创建 5 列的网格。
根据你的图片,第一行有 4 列,最后两行有 3 列。
因此,根据您的图片,您需要重新考虑您的设计。我看到的是:
- 你有基于最后两行的三列。
- 现在在第一行,x/999 将是一个包含两个组件的面板。该面板将位于第一列(带有 width/height 标签)。
- 同样在第一行,y/999 将是一个包含两个组件的面板,将从第 2 列开始,网格宽度为 2。
- 第二行和第三行将包含第二列中的 999 组件
- 按钮从第二行开始,网格高度为 2,将包含在第三列中
此外,您不应该设置组件的首选大小。每个组件将确定自己的首选大小。然后 GridBagLayout 将根据 row/column.
中的组件确定每个单元格的大小
我有一个 JPanel
和 GridBagLayout
作为布局管理器,我正在尝试这样安排:
忽略边框多余的深蓝色space。
我总共有 5 列和 3 行,所有组件都将 setPreferredSize()
设置为精确值以完全适合 JPanel
,它也有一个首选大小 (170 x 115) .
问题是 GridBagLayout
似乎在最后一列的宽度上增加了 30 像素,因为仅在 JPanel
的宽度上增加了 30 像素(总共 200 个)显示了组件正确的,像这样:
但由于额外的 space.
而将最后一列分开它添加了 30 像素,因为将 29 像素添加到 JPanel 的宽度会得到以下结果:
根据我的经验,可用的 space 太小而无法显示所有组件,然后使用 setMinimumSize()
.
我不知道那 30 像素是从哪里来的,请问谁能告诉我如何让组件合适?
代码如下所示,目前给出了这个结果:
忽略 JFrame
的额外黑色 space。
您可以在第 34 行更改 JPanel
的宽度。
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class Test{
public static void main (String[] args){
JFrame f;
SizeProperties p;
f = new JFrame();
p = new SizeProperties();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setPreferredSize(new Dimension(250,200));
f.getContentPane().setBackground(Color.BLACK);
f.setLayout(new FlowLayout());
f.add(p);
f.pack();
f.setVisible(true);
}
}
final class SizeProperties extends JPanel{
private GridBagConstraints c;
private PropertiesLabel xL,yL,wL,hL;
private PropertiesField xF,yF,wF,hF;
private ProportionToggleButton ptb;
SizeProperties(){
setBackground(new Color(18,101,142));
setPreferredSize(new Dimension(170,115));//Change width here
setLayout(new GridBagLayout());
xL = new PropertiesLabel("x:",25,25);
xF = new PropertiesField();
yL = new PropertiesLabel("y:",25,25);
yF = new PropertiesField();
wL = new PropertiesLabel("Width:",80,25);
wF = new PropertiesField();
hL = new PropertiesLabel("Height:",80,25);
hF = new PropertiesField();
ptb = new ProportionToggleButton();
c = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,0),0,0);
add(xL,c);
c = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(xF,c);
c = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,0),0,0);
add(yL,c);
c = new GridBagConstraints(3,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
add(yF,c);
c = new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(wL,c);
c = new GridBagConstraints(2,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(wF,c);
c = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
add(hL,c);
c = new GridBagConstraints(2,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(hF,c);
c = new GridBagConstraints(4,1,1,2,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
add(ptb,c);
}
}
final class PropertiesLabel extends JLabel{
PropertiesLabel(String label,int w,int h){
setText(label);
setPreferredSize(new Dimension(w,h));
setBackground(Color.BLACK);
setOpaque(true);
setForeground(Color.WHITE);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(SwingConstants.CENTER);
setVerticalAlignment(SwingConstants.CENTER);
}
}
final class PropertiesField extends JTextField{
private int validNumber = 0;
PropertiesField(){
setPreferredSize(new Dimension(45,25));
setBackground(new Color(202,226,255));
setForeground(Color.BLACK);
setFont(new Font("SansSerif",Font.PLAIN,14));
setHorizontalAlignment(JTextField.CENTER);
setText("999");
}
}
final class ProportionToggleButton extends JToggleButton{
ProportionToggleButton(){
setPreferredSize(new Dimension(15,60));
}
}
提前致谢。
I have in total 5 columns
据我所知不是。您不能只将组件分配给列。实际上,您需要在一行中包含 5 个组件才能创建 5 列的网格。
根据你的图片,第一行有 4 列,最后两行有 3 列。
因此,根据您的图片,您需要重新考虑您的设计。我看到的是:
- 你有基于最后两行的三列。
- 现在在第一行,x/999 将是一个包含两个组件的面板。该面板将位于第一列(带有 width/height 标签)。
- 同样在第一行,y/999 将是一个包含两个组件的面板,将从第 2 列开始,网格宽度为 2。
- 第二行和第三行将包含第二列中的 999 组件
- 按钮从第二行开始,网格高度为 2,将包含在第三列中
此外,您不应该设置组件的首选大小。每个组件将确定自己的首选大小。然后 GridBagLayout 将根据 row/column.
中的组件确定每个单元格的大小