Link to home
Start Free TrialLog in
Avatar of allelopath
allelopath

asked on

TabbedPane problem

With the code below, the bottom border of the tabs appear to be occluded.
User generated imageCan this be fixed?

package tabbedPaneTest;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

/**
 * TabbedPane
 *
 */
public class TabbedPane extends JTabbedPane { 

	private static TabbedPane instance = null;

	private JPanel bluePanel;
	private JPanel redPanel;
	private JPanel yellowPanel;

	final private int YELLOW_INDEX = 0;
	final private int BLUE_INDEX = 1;
	final private int RED_INDEX = 2;

	private JPanel blueTabTitlePanel;
	private JPanel redTabTitlePanel;
	private JPanel yellowTabTitlePanel;
	
	private JLabel blueLabel;
	private JLabel redLabel; 
	private JLabel yellowLabel;

	
    /**
	 * singleton, call initialize() instead
	 */
	private TabbedPane() {
		setLayout();
	}

	/**
	 * singleton
	 * 
	 * @return
	 */
	public static TabbedPane getInstance()
	{
		if (instance == null) {
			instance = new TabbedPane();
		}
		return instance;
	}

	/** 
	 * set layout of tabs
	 */
	private void setLayout() {

		this.setTabPlacement(SwingConstants.LEFT); // set tabs on left side
		
		FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT, 5, 5);

		yellowPanel = new JPanel();
		yellowPanel.setName("Yellow");
		this.addTab(yellowPanel.getName(), yellowPanel);
		
		yellowTabTitlePanel = new JPanel();
		yellowTabTitlePanel.setLayout(flowLayout);
		yellowTabTitlePanel.setOpaque(true);
		yellowLabel = new JLabel(yellowPanel.getName());
		yellowLabel.setOpaque(true);
		yellowTabTitlePanel.add(yellowLabel);
		Dimension dimension = yellowTabTitlePanel.getPreferredSize();
		int width = dimension.width;
		int height = dimension.height;
		yellowTabTitlePanel.setPreferredSize(new Dimension(width, height));
		this.setTabComponentAt(YELLOW_INDEX, yellowTabTitlePanel);
		
		bluePanel = new JPanel();
		bluePanel.setName("Blue");
		this.addTab(bluePanel.getName(), bluePanel);
		
		blueTabTitlePanel = new JPanel();
		blueTabTitlePanel.setLayout(flowLayout);
		blueTabTitlePanel.setOpaque(true);
		blueLabel = new JLabel(bluePanel.getName());
		blueLabel.setOpaque(true);
		blueLabel.setBackground(Color.white); // first tab selected
		blueTabTitlePanel.setBackground(Color.white); // first tab selected
		blueTabTitlePanel.add(blueLabel);
		blueTabTitlePanel.setPreferredSize(new Dimension(width, height));
		this.setTabComponentAt(BLUE_INDEX, blueTabTitlePanel);

		redPanel = new JPanel();
		redPanel.setName("Red");
		this.addTab(redPanel.getName(), redPanel);
		
		redTabTitlePanel = new JPanel();
		redTabTitlePanel.setLayout(flowLayout);
		redTabTitlePanel.setOpaque(true);
		redLabel = new JLabel(redPanel.getName());
		redLabel.setOpaque(true);
		redTabTitlePanel.add(redLabel);
		redTabTitlePanel.setPreferredSize(new Dimension(width, height));
		this.setTabComponentAt(RED_INDEX, redTabTitlePanel);
		
	}
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String args[]) {

		try{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		try {

			final JFrame frame = new JFrame();
			TabbedPane tabbedPane =  TabbedPane.getInstance();

			frame.getContentPane().add(new JScrollPane(tabbedPane));
			frame.setTitle("TabbedPane");
			frame.setPreferredSize(new Dimension(500, 500));
			frame.addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent e) {
				}
			});

			frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			frame.setLocation(300, 200);
			frame.pack();
			frame.setVisible(true);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Open in new window

Avatar of Mick Barry
Mick Barry
Flag of Australia image

looks like your size of yuor panel is too high for the space available.
Do you actually need to paint the panel background?
Avatar of allelopath
allelopath

ASKER

I've tried limiting the height of the panel, but that doesn't fix the problem.

In this example, the need for the panel is not apparent. In an actual application, I have an icon and text on the panel, the panel serving as the container for the 2 components.

why aren't you just using a JLabel
you may want to override paintcomponent...
The same thing happens if I use JLabel:
//this.setTabComponentAt(YELLOW_INDEX, yellowTabTitlePanel);
this.setTabComponentAt(YELLOW_INDEX, yellowLabel);

Open in new window

>>you may want to override paintcomponent...
Can you provide detail? Do you mean create a TabTilePanel class and override paintComponent in there? If so, what would I do in paintComponent?
ASKER CERTIFIED SOLUTION
Avatar of ksivananth
ksivananth
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
ksivananth:
That works. Thank you.

This would affect all tabbed panes in an application, yes?
If so, is there a way to get to it affect only this one tabbed pane?

SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks. good stuff.