Of course! JTabbedPane is a fundamental Swing component that allows you to display a set of components on a single screen, with a tab for each component. This is extremely useful for saving screen real estate and organizing related information into logical sections.

Here’s a comprehensive guide covering everything from basic usage to advanced features, complete with code examples.
What is JTabbedPane?
Imagine a web browser with multiple tabs. Each tab has a label ("Home", "News", "Sports") and clicking on it brings a different "page" (content) to the foreground. JTabbedPane works exactly the same way.
- Purpose: To switch between different views or sets of components.
- Key Components:
- Tabs: The clickable labels at the top (or other edges) of the pane.
- Tab Components: The actual content (e.g., a
JPanel, aJTable, a text editor) that is displayed when a tab is selected. - Placement: The position of the tabs (top, bottom, left, right).
Basic Usage: Creating a Simple JTabbedPane
Let's start with the most basic example. We'll create a JTabbedPane with three tabs, each containing a simple JPanel with a different background color and a label.
The Code
import javax.swing.*;
import java.awt.*;
public class BasicTabbedPaneExample {
public static void main(String[] args) {
// Create a new JFrame (the main window)
JFrame frame = new JFrame("Basic JTabbedPane Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 1. Create the JTabbedPane
JTabbedPane tabbedPane = new JTabbedPane();
// 2. Create components for each tab
JPanel panel1 = new JPanel();
panel1.add(new JLabel("This is the first tab"));
panel1.setBackground(Color.lightGray);
JPanel panel2 = new JPanel();
panel2.add(new JLabel("This is the second tab"));
panel2.setBackground(Color.yellow);
JPanel panel3 = new JPanel();
panel3.add(new JLabel("This is the third tab"));
panel3.setBackground(Color.green);
// 3. Add the components to the tabbed pane
// addTab(String title, Component component)
tabbedPane.addTab("Tab 1", panel1);
tabbedPane.addTab("Tab 2", panel2);
tabbedPane.addTab("Tab 3", panel3);
// 4. Add the tabbed pane to the frame's content pane
frame.add(tabbedPane, BorderLayout.CENTER);
// Make the window visible
frame.setVisible(true);
}
}
Explanation
JFrame: We create a standard window to hold ourJTabbedPane.new JTabbedPane(): This instantiates our tabbed pane. By default, tabs are placed at the top.JPanelComponents: For each tab, we create aJPanel. This is a generic container where we can place any Swing components (labels, buttons, text fields, etc.).tabbedPane.addTab(...): This is the core method. We add a tab by specifying:- A
Stringfor the tab's title. - A
Component(in this case, ourJPanel) that will be displayed when the tab is selected.
- A
frame.add(tabbedPane, BorderLayout.CENTER): We add theJTabbedPaneto the center of the frame's layout manager. This ensures it will resize correctly.
Common Constructors and Methods
Here are the most frequently used constructors and methods for JTabbedPane.

Constructors
| Constructor | Description |
|---|---|
JTabbedPane() |
Creates an empty JTabbedPane with tabs placed at the top. |
JTabbedPane(int tabPlacement) |
Creates an empty JTabbedPane with tabs placed at the specified position. JTabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT, JTabbedPane.RIGHT. |
Key Methods
| Method | Description |
|---|---|
addTab(String title, Component component) |
Adds a new tab with the given title and component. |
addTab(String title, Icon icon, Component component, String tip) |
Adds a tab with a title, icon, component, and tooltip. |
insertTab(String title, Icon icon, Component component, String tip, int index) |
Inserts a new tab at a specific position. |
removeTabAt(int index) |
Removes the tab at the specified index. |
remove(Component component) |
Removes the tab associated with the specified component. |
setSelectedIndex(int index) |
Programmatically selects the tab at the given index. |
getSelectedIndex() |
Returns the index of the currently selected tab. |
getSelectedComponent() |
Returns the component that is currently being displayed. |
setTitleAt(int index, String title) |
Changes the title of an existing tab. |
setIconAt(int index, Icon icon) |
Sets an icon for a specific tab. |
setTabComponentAt(int index, Component component) |
(Very Powerful) Sets a custom component (like a button with a label) to be used as the tab itself. |
Advanced Features
a) Changing Tab Placement
You can place tabs on any side of the pane using the constructor or the setTabPlacement() method.
// Tabs on the bottom JTabbedPane bottomTabs = new JTabbedPane(JTabbedPane.BOTTOM); // Or change it after creation tabbedPane.setTabPlacement(JTabbedPane.LEFT);
b) Adding Icons to Tabs
Icons make your tabs more visually appealing. You need to provide an Icon object.
import javax.swing.ImageIcon;
// ... inside your main method ...
ImageIcon icon1 = new ImageIcon("path/to/your/icon1.png");
ImageIcon icon2 = new ImageIcon("path/to/your/icon2.png");
tabbedPane.addTab("Tab 1", icon1, panel1);
tabbedPane.addTab("Tab 2", icon2, panel2);
c) Tooltips for Tabs
Provide helpful hints when the user hovers over a tab.
tabbedPane.addTab("Tab 1", panel1);
tabbedPane.setToolTipTextAt(0, "This is the main settings panel"); // Tooltip for the first tab (index 0)
d) Custom Tab Components (The Most Powerful Feature)
Sometimes, the default label isn't enough. You might want a close button (like in a web browser) on each tab. You can achieve this by setting a custom component for the tab itself.

The key is to use setTabComponentAt(). This component must be able to render itself and, importantly, respond to mouse clicks to change the selected tab.
Example: Adding a Close Button to a Tab
This is a classic and very useful example.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CustomTabComponentExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Custom Tab Component Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
JTabbedPane tabbedPane = new JTabbedPane();
// Create a panel for the first tab
JPanel panel1 = new JPanel();
panel1.add(new JLabel("Content of Panel 1"));
tabbedPane.addTab("Tab 1", panel1);
// Create a panel for the second tab
JPanel panel2 = new JPanel();
panel2.add(new JLabel("Content of Panel 2"));
tabbedPane.addTab("Tab 2", panel2);
// Create a panel for the third tab
JPanel panel3 = new JPanel();
panel3.add(new JLabel("Content of Panel 3"));
tabbedPane.addTab("Tab 3", panel3);
// --- THIS IS THE IMPORTANT PART ---
// Create a custom component for the first tab
JLabel label1 = new JLabel("Tab 1");
JButton button1 = new JButton("x");
JPanel customTab1 = new JPanel(new BorderLayout(5, 0));
customTab1.add(label1, BorderLayout.WEST);
customTab1.add(button1, BorderLayout.EAST);
customTab1.setOpaque(false); // So the background of the tab shows through
// Add the action listener to the button
final int tabIndexToClose = 0;
button1.addActionListener(e -> tabbedPane.removeTabAt(tabIndexToClose));
// Set the custom component for the tab
tabbedPane.setTabComponentAt(0, customTab1);
// --- END OF IMPORTANT PART ---
frame.add(tabbedPane, BorderLayout.CENTER);
frame.setVisible(true);
}
}
Explanation of the Custom Tab:
- We create a
JPanel(customTab1) with aBorderLayout. - We add a
JLabelto theWESTregion to show the tab's title. - We add a
JButtonwith the text "x" to theEASTregion. - We add an
ActionListenerto the button. When clicked, it callstabbedPane.removeTabAt(0), which removes the first tab. - Finally,
tabbedPane.setTabComponentAt(0, customTab1)tells theJTabbedPaneto use ourcustomTab1panel as the visual representation for the tab at index 0.
Listening for Tab Changes
Often, you need to know when the user selects a different tab. You can do this by adding a ChangeListener.
// Add this after creating your tabbedPane
tabbedPane.addChangeListener(e -> {
// Get the source of the event (our tabbedPane)
JTabbedPane sourceTabbedPane = (JTabbedPane) e.getSource();
// Get the newly selected index
int index = sourceTabbedPane.getSelectedIndex();
System.out.println("Tab changed to: " + index);
// You can get the component of the selected tab
Component selectedComponent = sourceTabbedPane.getSelectedComponent();
// ... do something with the selected component ...
});
Best Practices
- Use
BorderLayout.CENTER: Always add yourJTabbedPanetoBorderLayout.CENTERof its parent container. This allows it to expand and fill the available space. - Separate Concerns: For complex applications, create a separate class for each tab's content panel. This keeps your code organized and manageable.
- Custom Icons: Use small, simple icons (e.g., 16x16 pixels) for tabs to keep them from looking cluttered.
- Consider
JSplitPane: If you want a tab to show two panels side-by-side (e.g., a file tree and a text editor), place aJSplitPaneinside the tab.
