【问题标题】:Why can't I insert my JTextField inside my JPanel?为什么我不能在我的 JPanel 中插入我的 JTextField?
【发布时间】:2017-06-15 04:02:25
【问题描述】:

我的 JTextField 没有显示,只有paintComponent

public static final int WIDTH = 800;
public static final int HEIGHT = 600;

private JTextField txt;

public Painel(){
    super();
    setFocusable(true);
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    setLayout(new FlowLayout());
    txt = new JTextField();
    txt.setBounds(400, 300, 50, 20);
}

【问题讨论】:

  • 您所做的只是创建了一个JTextField 对象,您从未以任何方式将其添加到您的面板中。
  • setBounds在布局管理器的控制下将毫无意义
  • 这个setLayout(new FlowLayout()); 和这个txt.setBounds(400, 300, 50, 20); 不兼容。文本字段的位置由布局(+ 布局填充和边框)控制。文本字段的大小部分取决于布局,也取决于为其设置的列数和字体大小。
  • 编程语言非常愚蠢——它们只做你告诉他们的事情,所以如果你创建了一个组件但不将它添加到任何东西上,Java 不会神奇地将你的组件添加到任何东西上。更重要的是,您询问的是 Swing 组件的使用,但通过这个问题表明您没有先查看教程,在提出此类问题之前您应该始终这样做。您真的不想使用“猜测程序”作为创建程序的启发式方法。真的。
  • @HovercraftFullOfEels 虽然 "program by guessing" 更准确,但我更愿意将其视为“魔术编程”。从头到尾都很棒的评论。

标签: java swing jpanel jtextfield


【解决方案1】:

您必须设置文本字段中的列数或为其提供默认文本。以下代码应该适合您。我已经更新了之前的答案以使用 Gridbag 布局。但是,您仍然需要设置 JTextField 中的列数来呈现它。

    public class TestFrame extends JFrame {

    public static void main(String[] args) {
        new TestFrame();
    }

    private TestFrame() throws HeadlessException {
        super();

        this.setLocationByPlatform(true);
        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[] { 100, 0 };
        gbl_contentPane.rowHeights = new int[] { 0, 0, 0 };
        gbl_contentPane.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
        gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
        contentPane.setLayout(gbl_contentPane);

        JTextField textField = new JTextField();
        GridBagConstraints gbc_textField = new GridBagConstraints();
        gbc_textField.insets = new Insets(0, 0, 5, 0);
        gbc_textField.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField.gridx = 1;
        gbc_textField.gridy = 0;
        contentPane.add(textField, gbc_textField);
        textField.setColumns(10);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
}

希望这会有所帮助。快乐编码!

【讨论】:

  • 成功了!!!万分感谢 !!!我该如何感谢您的帮助?我是这个网站的新手
  • setPreferredSize(new Dimension(WIDTH, HEIGHT)); 这只是对所需大小的猜测。 txt.setBounds(400, 300, 50, 20); 布局会忽略它。
  • 我刚刚将 Layout 设置为 null 并且 JTextField 到了正确的位置,谢谢!!
  • 我不确定是否要否决这个答案,但@HovercraftFullOfEels 的评论让我相信我应该这样做。它延续了不良做法,并以 OP 的非常非最佳解决方案告终。
  • @AndrewThompson:仅供参考,答案改进了。投票被推翻。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多