Search code examples
javaswingappletjtabbedpanegridbaglayout

JTabbedPane with GridBagLayout


I understood the concepts behind JTabbedPane and GridBagLayout. However, when I try to use both together I fail. That is, when I use GBLayout, my other tabs (each tab having different functionality) are not showing up. Please help. Thank You.

Here is my code:

    import java.awt.*;
    import javax.swing.*;

    public class Tryout extends JFrame {

    private static final long serialVersionUID = 1L;
    private     JTabbedPane tabbedPane;
    private     JPanel      panel1;
    private     JPanel      breakfast;

    public Tryout()
    {   
        JPanel topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        createPage1(); //Tab1
        createPage2(); //Tab2

        tabbedPane = new JTabbedPane();
        tabbedPane.addTab( "Input Form", panel1 );
        tabbedPane.addTab( "Breakfast", breakfast );
        topPanel.add( tabbedPane, BorderLayout.CENTER );
    }

    public void createPage1()
    {
        /* Works fine when I un-comment this
        panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());
        panel1.add(new JLabel("Hi"), BorderLayout.NORTH); 
        */
        //Tabs not getting displayed if I add the code below with GBLayout
        JPanel panel = new JPanel(new GridBagLayout());
        this.getContentPane().add(panel);

        JLabel label = new JLabel("Form");

        JPanel tableButtonPanel = new JPanel();
        tableButtonPanel.add(new JButton("Add Thing"));
        tableButtonPanel.add(new JRadioButton("Delete Thing"));
        tableButtonPanel.add(new JButton("Modify Thing"));

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(label, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        panel.add(tableButtonPanel, gbc);

    }

    public void createPage2()
    {
        breakfast = new JPanel();
        breakfast.setLayout( new BorderLayout() );
        breakfast.add( new JButton( "North" ), BorderLayout.NORTH );
        breakfast.add( new JButton( "South" ), BorderLayout.SOUTH );
        breakfast.add( new JButton( "East" ), BorderLayout.EAST );
        breakfast.add( new JButton( "West" ), BorderLayout.WEST );
        breakfast.add( new JButton( "Center" ), BorderLayout.CENTER );
    }

public static void main(String args[]) {

        Tryout ex = new Tryout();
        ex.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ex.setSize(750,750);
        ex.setVisible(true);
        ex.setTitle( "Recipe Tracker" );
        ex.setBackground( Color.gray );

    }
}

Solution

  • The problem is that, in createPage1, you are adding a new JPanel to the JFrame:

    this.getContentPane().add(panel);
    

    which displaces topPanel (which contains the JTabbedPane) which is in the JFrame's BorderLayout.CENTER position. Therefore no JTabbedPane is appearing.

    You could simply return the new JPanel that has been created and add it to your JTabbedPane:

    public JPanel createPage1() {
    
       JPanel panel = new JPanel(new GridBagLayout());
       // this.getContentPane().add(panel); don't do this...
       ...
    
       return panel;
    }
    

    and add:

    tabbedPane.addTab("Input Form", createPage1());