allelopath
asked on
TabbedPane problem
With the code below, the bottom border of the tabs appear to be occluded.
Can this be fixed?
Can 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();
}
}
}
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.
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...
ASKER
The same thing happens if I use JLabel:
//this.setTabComponentAt(YELLOW_INDEX, yellowTabTitlePanel);
this.setTabComponentAt(YELLOW_INDEX, yellowLabel);
ASKER
>>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?
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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?
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks. good stuff.
Do you actually need to paint the panel background?