Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 410
  • Last Modified:

TabbedPane problem

With the code below, the bottom border of the tabs appear to be occluded.
Occluded TabCan 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

0
allelopath
Asked:
allelopath
  • 5
  • 3
  • 2
2 Solutions
 
objectsCommented:
looks like your size of yuor panel is too high for the space available.
Do you actually need to paint the panel background?
0
 
allelopathAuthor Commented:
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.

0
 
objectsCommented:
why aren't you just using a JLabel
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
ksivananthCommented:
you may want to override paintcomponent...
0
 
allelopathAuthor Commented:
The same thing happens if I use JLabel:
//this.setTabComponentAt(YELLOW_INDEX, yellowTabTitlePanel);
this.setTabComponentAt(YELLOW_INDEX, yellowLabel);

Open in new window

0
 
allelopathAuthor Commented:
>>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?
0
 
ksivananthCommented:
try adding this code,

            try{
                  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                  UIManager.getDefaults().put( "TabbedPane.tabInsets", new Insets( 1, 2, 3, 2 ) ) ;
            }
            catch (Exception e) {
                  e.printStackTrace();
            }
0
 
allelopathAuthor Commented:
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?

0
 
ksivananthCommented:
>>This would affect all tabbed panes in an application, yes?

Yes

>>If so, is there a way to get to it affect only this one tabbed pane?

you need to override the "tabInsets" property in the WindowsTabbedPaneUI( may differ based on the env you run ) and set this as the UI for your tabbedpane, for e.g., in windows,

                  TabbedPane tabbedPane =  TabbedPane.getInstance();
                  tabbedPane.setUI( new WindowsTabbedPaneUI(){
                        protected void installDefaults(){
                              super.installDefaults() ;
                              tabInsets = new Insets( 1, 1, 3, 1 ) ;
                        }
                  } ) ;
0
 
allelopathAuthor Commented:
Thanks. good stuff.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 5
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now