【问题标题】:Java change JTextField size inside a GridLayoutJava 更改 GridLayout 内的 JTextField 大小
【发布时间】:2015-02-08 01:25:58
【问题描述】:

我有一个 GridLayout(3,2),如下所示,带有 2 个 JLabels、2 个 JTextField 和一个 JButton。我添加它们,如图片或代码所示。一切都很好,但是 JTextField 的大小太大了,我希望它像我画的红线所示。我试过说jtf3.setPreferredSize( new Dimension( x, y ) );,但它根本没有改变尺寸。另一种解决方案是使 GridLayout 有点 GridLayout(3,2,1,50) 例如(通过添加 50),但这也将 JLabels 移到顶部......我只想完全如图所示......有什么想法吗?非常感谢

JPanel copying_panel = new JPanel();
copying_panel.setLayout(new GridLayout(3, 2));
copying_panel.setBackground(new Color(200, 221, 242));
JLabel jl4 = new JLabel("From:", SwingConstants.CENTER);
JTextField jtf3 = new JTextField();
JLabel jl5 = new JLabel("To:", SwingConstants.CENTER);
JTextField jtf4 = new JTextField();
JLabel jl6 = new JLabel();
JButton jb2 = new JButton("Go");

copying_panel.add(jl4);
copying_panel.add(jtf3);
copying_panel.add(jl5);
copying_panel.add(jtf4);
copying_panel.add(jl6);
copying_panel.add(jb2);

【问题讨论】:

    标签: java swing awt layout-manager grid-layout


    【解决方案1】:

    GridLayout 就是这样工作的,它为所有组件提供相等的空间。相反,请考虑改用GridBagLayout

    详情请见How to Use GridBagLayout

    JPanel copying_panel = new JPanel();
    copying_panel.setLayout(new GridBagLayout());
    copying_panel.setBackground(new Color(200, 221, 242));
    JLabel jl4 = new JLabel("From:", SwingConstants.CENTER);
    JTextField jtf3 = new JTextField(10);
    JLabel jl5 = new JLabel("To:", SwingConstants.CENTER);
    JTextField jtf4 = new JTextField(10);
    JButton jb2 = new JButton("Go");
    
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 0;
    gbc.gridy = 0;
    copying_panel.add(jl4, gbc);
    
    gbc.gridy++;
    copying_panel.add(jl5, gbc);
    
    gbc.anchor = GridBagConstraints.EAST;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx++;
    gbc.gridy = 0;
    copying_panel.add(jtf3, gbc);
    
    gbc.gridy++;
    copying_panel.add(jtf4, gbc);
    
    gbc.anchor = GridBagConstraints.WEST;
    gbc.fill = GridBagConstraints.NONE;
    gbc.gridy++;
    copying_panel.add(jb2, gbc);
    

    【讨论】:

    • JLabels 和 JTextFields 太短了。我应该只对它们设置PreferedSize 吗?
    • 地狱没有。您可以通过columns 属性为文本字段提供大小提示,如上例new JTextField(10) 所示。您可以使用GridBagConstraint#insets 调整每个组件周围的填充量。有关详细信息,请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?。我会小心地将标签与长距离的字段分开,这可能会“断开”这两个组件,让用户感到困惑
    • 您也可以使用gridbagconstraints的“weightx”值根据剩余空间调整文本字段的大小。在这种情况下,您不会设置列...只需 new JTextField() 就可以了。但是,需要有剩余空间,否则您的文本字段的宽度将为零。如果只有文本字段应该扩展,那么 weightx 将为 1,所有其他项目的 weightx 将为 0。(所有权重加起来应为 1)
    • @pcalkins 这完全取决于您想要实现的目标,使用 weightx 也意味着,如果您将组件调整为全屏,则文本字段将占据整个剩余空间组件,这可能不是您想要实现的,但是使用列值播种文本字段,我们还使用首选大小播种它们,但是,这一切都归结为您想要实现的目标
    • 是的。我还应该提到,你会想要设置 GridBagConstraints.fill 或者它也将是零宽度......我一直在使用一个定义宽度的滚动窗格,并将视口设置为一个具有 gridbaglayout 的面板......在我的情况下,我需要排列某些按钮,并用文本字段填充剩余空间...我将文本字段的填充设置为 GridBagConstraints.HORIZONTAL 并且它们占用了所有的权重x...我仍在学习处理 Swing我自己,所以我可能会在使用这种方法时遇到更多问题。
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多