Re: JTabbedPane fails to clip tab text
In article <fc8f8e86-58b9-44ca-962b-301da5c8710c@googlegroups.com>,
FredK <fred.l.kleinschmidt@gmail.com> wrote:
I have a JTabbedPane with multiple tabs, using WRAP_TAB_LAYOUT.
When the user shrinks the window, the longest tab label draws its
text outside the tab area instead of clipping it. It even runs
over into the next tab.
Also, when using Numbus LAF, it does not size properly.
What am I missing to get this to work properly?
The converse of Knute's key insight is that pack() will cause the
JTabbedPane to adopt the preferred size of the _largest_ tab
component. In the variation below, each component panel has a
random initial width. Change the L&F and/or resize the frame to see
the effect. If you can test on Mac OS X, note that AquaLookAndFeel
clips the long label at small sizes.
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class TabTester extends JPanel {
private static final Random r = new Random();
public TabTester() {
setLayout(new BorderLayout());
JTabbedPane pane = new JTabbedPane(
JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
pane.addTab(
"this is tab number 1, long label", createPane("p1"));
pane.addTab("tab number 2", createPane("p2"));
pane.addTab("this is tab 3", createPane("p3"));
pane.addTab("tab 4", createPane("p4"));
pane.addTab("another tab", createPane("p5"));
add(pane, BorderLayout.CENTER);
}
private JPanel createPane(final String name) {
final Dimension d = new Dimension(300 + r.nextInt(42), 200);
final JPanel p = new JPanel(new GridLayout()) {
@Override
public Dimension getPreferredSize() {
return d;
}
};
final JLabel label = new JLabel(name, JLabel.CENTER);
p.add(label);
p.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
label.setText(name + ": width: " + p.getWidth());
}
});
return p;
}
// http://stackoverflow.com/a/11949899/230513
private static JToolBar createToolBar(final Component parent) {
final UIManager.LookAndFeelInfo[] available =
UIManager.getInstalledLookAndFeels();
List<String> names = new ArrayList<String>();
for (LookAndFeelInfo info : available) {
names.add(info.getName());
}
final JComboBox combo = new JComboBox(names.toArray());
String current = UIManager.getLookAndFeel().getName();
combo.setSelectedItem(current);
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
int index = combo.getSelectedIndex();
try {
UIManager.setLookAndFeel(
available[index].getClassName());
SwingUtilities.updateComponentTreeUI(parent);
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
});
JToolBar bar = new JToolBar("L&F");
bar.setLayout(new FlowLayout(FlowLayout.LEFT));
bar.add(combo);
return bar;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TabTester t = new TabTester();
t.add(createToolBar(frame), BorderLayout.NORTH);
frame.add(t);
frame.pack();
frame.setVisible(true);
}
});
}
}
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>