无法将 JTextfield 添加到 JTabbedPane 中的 JPanel 上



我正在尝试使用Swing制作一个基本的UI。我想有一个带有多个选项卡的JTabbedPaneJFrame。如果我只用JTextField做 1 JPanel,它就可以正常工作,但只要我想添加另一个带有JTextFieldJPanel,它就会什么也没显示。我在这里做错了什么?

下面是一个快速示例:

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
public class SwingUI {
    private final JFrame frame;
    private final JTabbedPane tabbedPane;
    public SwingUI(){
        frame = new JFrame("Test");
        frame.setSize(1000, 1000);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(1, 1));
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Login", makeLoginPanel());
        tabbedPane.addTab("Login2", makeLoginPanel());  //if this is left out it works
        frame.getContentPane().add(tabbedPane);
    }
    private JPanel makeLoginPanel(){
        JPanel p = new JPanel();
        p.setLayout(null);
        JLabel lblName = new JLabel("Name:");
        lblName.setBounds(50,50,100,30);
        p.add(lblName);
        JTextField x = new JTextField("text");
        x.setBounds(200,200,200,200);
        p.add(x);
        return p;
    }
}

组件添加到框架后,框架应可见。

所以:

frame.setVisible( true );

应该是构造函数中的最后一条语句。

也:

frame.setSize(1000, 1000);

不要对大小进行硬编码。您不知道其他人可能正在使用什么分辨率。

而是使用:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

并且框架将在屏幕上最大化打开。

frame.getContentPane().setLayout(new GridLayout(1, 1));

不要使用 GridLayout。默认布局是边框布局,默认情况下,它允许您将组件添加到 CENTER,该组件将填充框架的整个空间。

最新更新