【问题标题】:Set JTextField width to match width of JPanel设置 JTextField 宽度以匹配 JPanel 的宽度
【发布时间】:2014-10-16 03:27:49
【问题描述】:

我正在寻找一种方法来设置 JTextField 的显示以占据包含它的 JPanel 的整个宽度。

我能找到的唯一方法是在调用pack()setVisible() 方法之后,在JPanel 上调用setColumns() 方法和getWidth() 方法。但是当我这样做时,JTextField 最终会比包含它的JPanel 大得多。我对为什么会发生这种情况的假设是 getWidth() 返回 JPanel 的像素大小,而 JTextField 中的列都大于一个像素。

我什至没有寻找动态调整大小的字段,只是为了与程序开始时的 JPanel 一样宽

非常感谢任何帮助

【问题讨论】:

    标签: java methods jpanel jtextfield


    【解决方案1】:

    使用适当的布局管理器...

    记住,决定它应该多大不是组件的责任,这是布局管理器的责任,组件只能提供关于它想要多大的提示......

    例如,您可以使用GridBagLayout...

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            public TestPane() {
    
                JTextField field = new JTextField(10);
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.weightx = 1;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                add(field, gbc);
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
        }
    
    }
    

    查看Laying Out Components Within a Container了解更多详情

    【讨论】:

    • 所以“抓取”面板的水平尺寸线 gbc.fill = GridBagConstraints.HORIZONTAL;或者是 GridBagConstraints 以某种方式调用的 getPreferredSize() 方法 --- 顺便说一句,感谢您的帮助,这完美地工作
    • @chope_chope weightxfillGridBagConstraints 中的组合,这两个会自动覆盖字段的首选宽度属性。