Java Swing JFrame布局

我刚刚编写了一个简单的代码,我希望在主框架上显示一个文本字段和一个按钮,但是在运行之后,我看到的是文本字段。

如果我在文本字段后面写了按钮的代码,那么只显示按钮。

知道为什么吗?

JFrame mainframe=new JFrame(); mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainframe.setBounds(0,0,200,200); JButton jb=new JButton(); jb.setText("Leech"); mainframe.add(jb); JTextField link=new JTextField(50); mainframe.add(link); mainframe.pack(); mainframe.setVisible(true); 

将组件添加到JPanel,然后将该面板添加到JFrame的ContentPane。

 JFrame window = new JFrame(); JPanel mainframe = new JPanel(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setBounds(0,0,200,200); JButton jb = new JButton(); jb.setText("Leech"); mainframe.add(jb); JTextField link = new JTextField(50); mainframe.add(link); window.getContentPane().add(mainframe); window.pack(); window.setVisible(true); 

JFrame的默认布局是BorderLayout 。 在具有这种布局的Container上调用add方法相当于调用add(..., BorderLayout.CENTER)BorderLayout每个位置只能包含一个元素。 因此打两个电话

 mainframe.add(jb); mainframe.add(link); 

导致包含您添加的最后一个组件的CENTER。 如果你想避免这种情况,可以将它添加到不同的位置,或者通过调用JFrame#setLayout FlowLayout使用另一个布局管理器(例如FlowLayout

不要将组件直接添加到JFrame,而是使用JPanel作为具有所需LayoutManager的容器。

在这里,您可以找到有关布局管理器的几个教程。

基本上在Swing中,LayoutManager负责布置子组件(确定它们的位置和大小),因此您在应用程序中使用的每个容器组件都应配置适当的LayoutManager。

JFrame的默认布局管理器是BorderLayout。 如果您想要自动布局,可以使用FlowLayout:

 mainframe.setLayout(new FlowLayout()); 

如果要通过setBounds()方法指定坐标,则必须取消JFrame上布局管理器的设置:

 mainframe.setLayout(null); jb.setBounds(10,10,100,50); link.setBounds(10,70,180,100); 

如果你看到BorderLayout Documentation mainframe.add(jb); 等于mainframe.add(jb,BorderLayout.CENTER); mainframe.add(链接); 等于mainframe.add(jb,BorderLayout.CENTER);

所以它只显示最后一个