无法将JTextField添加到JFrame。

8

我无法将JTextField添加到JFrame中。我的JFrame包含一个JLabel和一个JTextField。 首先,我已经添加了JLabel,它可以工作。这是代码。

private static void createandshowGUI()
     {

    JFrame frame =new JFrame("HelloSwing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(Color.red);
    frame.setSize(200,200);

    JLabel label=new JLabel("New To Java!!");
    frame.getContentPane().add(label);
    frame.setVisible(true);
}
public static void main(String[] args) {
    createandshowGUI();}   //and it shows the output like below .

带有JLabel的框架

然后我添加了JTextField。

    JLabel label=new JLabel("New To Java!!");
    frame.getContentPane().add(label);

   JTextField jtf=new JTextField();
   frame.getContentPane().add(jtf);

    frame.setVisible(true);

但是它显示的输出如下。

具有JLabel和JTextField的框架

请有人帮助我解决这个问题。我可以向JFrame添加多个组件吗?由于我是Java的新手,我对框架、ContentPane和布局之间存在困惑。


4
非常感谢您提供了一个结构非常优秀的问题。 - christopher
3个回答

8
实际上,您已成功添加了JTextField。您遇到的问题源于布局管理器将其拉伸到整个框架。
默认情况下,JFrame的内容窗格使用BorderLayout管理器。(请参见如何使用边框布局
在我的应用程序中,我总是最终使用MigLayout管理器,但首先您可能需要熟悉一般的布局管理器。(请参见布局管理器的可视化指南

+1 for MigLayout - 当我寻找布局时,我也会选择使用它。 - exexzian

3
您的ContentPane默认使用BorderLayout,仅接受一个元素(默认为中心位置)。在添加第二个元素(JTextField)之后,它替换了最后一个元素(JLabel)。

使用单参数add将元素添加到Container时,您没有指定要将其放置在哪个位置,因此布局管理器将随意选择位置。但是,如果您使用约束(使用重载的add),则可以更好地控制元素放置的位置。查看每个布局管理器的文档,以了解其工作原理和支持的约束条件。

对于您目前的情况,您可以使用一个中间的JPanel(它具有FlowLayout作为其默认LayoutManager - 对于正在学习的人来说,我认为这是最简单的)代替直接将元素添加到内容窗格,或者只需更改其布局即可。


不错的答案,但对于新手来说有点复杂。还是点赞。 - jobukkit

-1
一个 JFrame 只能有一个组件(除非你使用了它的 BorderLayout)。解决方案是使用一个 JPanel。你可以将对象添加到一个 JPanel 中,然后将 JPanel 添加到 JFrame 中。你还需要添加 import javax.swing.JPanel;。你可以像这样做:
private static void createandshowGUI()
{
    JFrame frame =new JFrame("HelloSwing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(Color.red);
    frame.setSize(200,200);

    JPanel panel = new JPanel(); //Create a JPanel

    JLabel label=new JLabel("New To Java!!");
    panel.add(label); // Add the label to the panel

    JTextField jtf = new JTextField();
    panel.add(jtf); // Add the JTextField to the panel

    frame.getContentPane().add(panel); // Add the panel to the JFrame
    frame.setVisible(true);
}
public static void main(String[] args) {
    createandshowGUI();}

这应该可以工作。


@Sam 但是丹尼尔·里科夫斯基的回答更有用,是吧?;-) - jobukkit
1
当然。这就是为什么我接受了那个答案。但是在边框布局方面遇到了一些问题,我正要问。而面板给了我即时的结果。 :) 谢谢。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接