【问题标题】:Not able to add JTextField to JFrame无法将 JTextField 添加到 JFrame
【发布时间】:2013-03-02 09:21:43
【问题描述】:

我无法将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 .

然后我添加了 JTextField 。

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

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

    frame.setVisible(true);

然后它显示这样的输出。

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

【问题讨论】:

  • +1 对于结构出色的问题。

标签: java swing jframe jtextfield layout-manager


【解决方案1】:

其实你已经成功添加了JTextField。您遇到的问题源于布局管理器将其延伸到整个框架。

JFrame 的内容窗格默认使用BorderLayout 管理器。 (见How to Use BorderLayout

在我的应用程序中,a 总是使用 MigLayout 管理器,但首先您可能想熟悉一下布局管理器。 (见A Visual Guide to Layout Managers

【讨论】:

  • +1 for MigLayout - 当我寻找布局时,我最终也会使用它
【解决方案2】:

你的ContentPane 默认有一个BorderLayout,它只接受一个元素(在默认位置 - 中心)。添加第二个元素(JTextField)后,它替换了最后一个元素(JLabel)。

当您使用单参数add 将元素添加到Container 时,您并没有指定您想要它们的位置,因此布局管理器会随意选择一个位置。 OTOH 如果您指定约束(使用overloaded add),那么您可以更好地控制元素的放置位置。查看每个布局管理器的文档,了解它们是如何工作的以及它支持哪些约束。

对于您当前的情况,您可以使用中间的 JPanel(默认为 FlowLayout - 恕我直言,对于仍在学习的人来说是最简单的),而不是直接向内容窗格添加元素,或者干脆将其布局更改为其他内容。

【讨论】:

  • 很好的答案,但对于新手来说有点太复杂了。还是 +1
【解决方案3】:

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 但 Daniel Rikowski 的回答更有用吗? ;-)
  • 是的。当然。这就是我接受这个答案的原因。但是在边框布局中遇到了一些问题,我正要问。小组给了我立竿见影的结果。 :) 谢谢。
猜你喜欢
  • 2019-06-06
  • 2015-11-08
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多