Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置gridwidth时,JDialog与GridBagLayout重叠_Java_Jtextfield_Gridbaglayout - Fatal编程技术网

Java 设置gridwidth时,JDialog与GridBagLayout重叠

Java 设置gridwidth时,JDialog与GridBagLayout重叠,java,jtextfield,gridbaglayout,Java,Jtextfield,Gridbaglayout,我正在尝试创建一个如下所示的JDialog: 但是JTextField跨越两列,因此几乎可以到达“FindNext”按钮。但是,当我尝试将JTextField的gridwidth设置为2时,我得到以下结果: 这是我的密码: JDialog dialog = new JDialog(frame, "Find"); dialog.setPreferredSize(new Dimension(370, 129)); Point p = frame.getLocation(); dialog.set

我正在尝试创建一个如下所示的JDialog:

但是JTextField跨越两列,因此几乎可以到达“FindNext”按钮。但是,当我尝试将JTextField的gridwidth设置为2时,我得到以下结果:

这是我的密码:

JDialog dialog = new JDialog(frame, "Find");
dialog.setPreferredSize(new Dimension(370, 129));
Point p = frame.getLocation();
dialog.setLocation(p.x + 53, p.y + 170);

Container c = dialog.getContentPane();
GridBagLayout gbl = new GridBagLayout();
c.setLayout(gbl);
GridBagConstraints gbc = new GridBagConstraints();

JLabel label = new JLabel("Find what:");
gbc.gridx = gbc.gridy = 0;
c.add(label, gbc);

JTextField field = new JTextField();
field.setMinimumSize(field.getPreferredSize());
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 2;
c.add(field, gbc);

JButton findNext = new JButton("Find Next");
findNext.setPreferredSize(new Dimension(82, 23));
gbc.gridx = 3;
c.add(findNext, gbc);

JCheckBox check = new JCheckBox("Match case");
gbc.gridx = 0;
gbc.gridy = 1;
c.add(check, gbc);

JRadioButton up = new JRadioButton("Up"), down = new JRadioButton("Down");
ButtonGroup group = new ButtonGroup();
group.add(up);
group.add(down);
gbc.gridx = 1;
c.add(up, gbc);
gbc.gridx = 2;
c.add(down, gbc);

JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension(82, 23));
cancel.addActionListener(e2 -> dialog.dispose());
gbc.gridx = 3;
c.add(cancel, gbc);

Font f = new Font("Segoe UI", Font.PLAIN, 12);
c.setFont(f);
for (Component child : c.getComponents())
    child.setFont(f);

dialog.pack();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setResizable(false);
dialog.setVisible(true);
提前谢谢

所以有两个问题

  • 您将
    gridwidth
    设置为
    2
    ,但从不重置它:
    gbc.gridwidth=2
    ,这意味着
    GridBagConstraints
    的所有后续使用具有
    gridwidth
    2
  • 过度使用
    setPreferredSize
    ,事实上,任何使用都是过度使用
  • 解决方案

    在重新使用
    GridBagConstraints
    之前,请先停止
    gridwidth

    gbc.gridwidth = 2;
    c.add(field, gbc);
    
    gbc.gridwidth = 1;
    //...
    
    不要使用
    setPreferredSize
    ,您无法控制可以更改跨多个平台组件所需大小的属性

    有关更多讨论,请参阅

    使用
    setPreferredSize

    setPreferedSize

    你能看到按钮之间的区别吗


    如果要在组件中添加填充,请首先使用
    EmptyBorder
    和/或
    GridBagConstraints#insets
    对话框。setPreferredSize(新维度(370129))
    是一个坏主意,它与您的特定问题直接相关,但作为旁注,所有的
    setPreferredSize
    调用都是一个问题。相反,摆脱它们,让布局管理器与packThanks一起完成它的工作!真不敢相信我忘了重置网格宽度。