AnnanFay
AnnanFay

Reputation: 9739

Can I have a JTabbedPane with a JMenuBar?

I'm trying to increase the amount of space available for tab content.

How can I put a menu bar, or equivalent, next to a list of tabs? (preferably on the left of the tabs, opposite of image)

TabbedPaneDemo with red arrow

Upvotes: 1

Views: 4301

Answers (2)

mKorbel
mKorbel

Reputation: 109815

not, directly not possible without override whole BacisTabbedPaneUI, all examples are various quality (look and feel and native os very sensitive), very good example by aephyr,

my view JTabbedPane is *** JComponent, funny example by implements GlassPane (you have set a some Borders for JMenuBar e.g. raised etchech & line border ??? :-)

crazy and dirty hack

enter image description here

enter image description here

from code

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class TabbedPaneWithManuBar {

    public void makeUI() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        for (int i = 0; i < 20; i++) {
            JPanel panel = new JPanel();
            panel.setName("tab" + (i + 1));
            panel.setPreferredSize(new Dimension(600, 100));
            tabbedPane.add(panel);
        }
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tabbedPane);
        frame.pack();
        Rectangle tabBounds = tabbedPane.getBoundsAt(0);
        Container glassPane = (Container) frame.getRootPane().getGlassPane();
        glassPane.setVisible(true);
        glassPane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.fill = GridBagConstraints.NONE;
        gbc.insets = new Insets(tabBounds.y + 23, 0, 0, 5);
        gbc.anchor = GridBagConstraints.NORTHEAST;
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createMenu("Menu Example 1"));
        menuBar.add(createMenu("Menu Example 1"));
        menuBar.add(createMenu("Menu Example 1"));
        menuBar.add(Box.createHorizontalGlue());
        menuBar.add(createMenu("About"));
        menuBar.setPreferredSize(new Dimension(menuBar.getPreferredSize().width , (int) tabBounds.getHeight() - 2));
        glassPane.add(menuBar, gbc);
        //JButton button = new JButton("My Button Position");
        //button.setPreferredSize(new Dimension(button.getPreferredSize().width, (int) tabBounds.getHeight() - 2));
        //glassPane.add(button, gbc);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JMenu createMenu(String title) {
        JMenu m = new JMenu(title);
        m.add("Menu item #1 in " + title);
        m.add("Menu item #2 in " + title);
        m.add("Menu item #3 in " + title);
        if (title.equals("About")) {
            m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }
        return m;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TabbedPaneWithManuBar().makeUI();
            }
        });
    }
}

Upvotes: 3

chenyi1976
chenyi1976

Reputation: 1122

You can use JideTabbedPane from jide.

Jide is commerical library, but this JideTabbedPane class are open source, get source code here: http://java.net/projects/jide-oss/

the screenshot is like below.enter image description here

Upvotes: 3

Related Questions