Не могу добавить JTextfield на JPanel в JTabbedPane - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь сделать базовый интерфейс с Swing. Я хочу иметь JFrame с JTabbedPane с несколькими вкладками. Если я только сделаю 1 JPanel с JTextField, он будет работать нормально, но как только я захочу добавить еще JPanel с JTextField, он просто ничего не показывает. Что я тут не так делаю?

Вот краткий пример:

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;
    }
}

1 Ответ

0 голосов
/ 12 января 2019

Рамка должна быть видимой ПОСЛЕ добавления компонентов к рамке.

Итак:

frame.setVisible( true );

должно быть последним утверждением в вашем конструкторе.

Также:

frame.setSize(1000, 1000);

Не указывайте размеры жестко. Вы не знаете, какое разрешение могут использовать другие люди.

Вместо этого используйте:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

и рамка развернется на вашем экране в развернутом виде.

Кроме того,

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

Не используйте GridLayout. Макет по умолчанию - BorderLayout, который позволит вам добавить компонент в CENTER по умолчанию, и этот компонент заполнит все пространство кадра.

...