我无法将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和Layouts之间感到困惑。
答案 0 :(得分:8)
实际上您已成功添加JTextField
。您遇到的问题源于布局管理器,它在整个框架中将其拉伸。
JFrame
的内容窗格默认使用BorderLayout
管理器。 (见How to Use BorderLayout)
在我的应用程序中,总是最终使用MigLayout管理器,但首先您可能希望熟悉布局管理器。 (见A Visual Guide to Layout Managers)
答案 1 :(得分:3)
默认情况下,您的ContentPane
有一个BorderLayout
,只接受一个元素(默认位置 - 中心)。添加第二个元素(JTextField
)后,它替换了最后一个元素(JLabel
)。
使用单参数Container
向add
添加元素时,您并未指定所需位置,因此布局管理器会随意选择一个位置。 OTOH如果您指定约束(使用overloaded add),那么您可以更好地控制元素的放置位置。检查每个布局管理器的文档,了解它们的工作方式以及它支持的约束条件。
对于您目前的情况,您可以使用中间JPanel
(LayoutManager
作为默认{{1}} - 最简单的恕我直言,但仍在学习的人),而不是直接添加元素内容窗格,或者只是将其布局更改为其他内容。
答案 2 :(得分:-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();}
这应该有用。