Setting font of JSlider
How do I set the font of a JSlider after it has been created, such
that its size is correct if it is the child of a JPanel used to
display a border ? (I use the JPanel for the border instead of
putting the border on the JPanel because using Nimbus L&F the
JSlider's border gets drawn inside the JSlider, clipping its contents)
I create a JSlider and a Hashtable for the tickmark labels, then
create the ticmark labels.
Then later I try to set the font.
If I just set the font on the jSlider, nothing happens. I have to set
the font on each of the labels for the font to change. But then the
jSlider's width is incorrect, clipping the labels.
Even if I do not use Nimbus, the problem occurs.
///// the code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.UIDefaults;
import javax.swing.border.Border;
/**
* @author flk0018
*/
public class Test1 extends JPanel {
JComponent panel;
JSlider slider;
Font f;
public Test1() {
slider = new JSlider( SwingConstants.VERTICAL );
slider.setPaintTicks( true );
slider.setPaintLabels( true );
slider.setMajorTickSpacing( 20 );
f = new Font( "Monospaced", Font.BOLD, 20 );
slider.setFont( f );
Hashtable <Integer, JLabel> labelTable = new Hashtable <Integer,
JLabel>();
String smin = "10.000";
JLabel lab;
lab = new JLabel( smin );
// lab.setFont( f ); // If done here, the size is correct
labelTable.put( 0, lab );
slider.setLabelTable( labelTable );
panel = new JPanel();
Border border = BorderFactory.createLineBorder( Color.black );
panel.setBorder( border );
panel.add( slider );
add( panel );
setComponentFont( f ); // if done here, labels are clipped
}
public void setComponentFont( Font font ) {
Dimension d = panel.getPreferredSize();
UIDefaults def = new UIDefaults();
def.put( "font", font );
//slider.setFont( font );
Dictionary < ? , ? > labs = slider.getLabelTable();
if ( labs != null ) {
for ( Enumeration < ? > keys = labs.keys();
keys.hasMoreElements(); ) {
Object key = keys.nextElement();
JComponent label = (JComponent) labs.get( key );
// label.putClientProperty( "Nimbus.Overrides",
def );
//
label.putClientProperty( "Nimbus.Overrides.InheritDefaults", false );
label.setFont( font );
label.setPreferredSize( null );
d = label.getPreferredSize();
label.setSize( d );
}
}
slider.setPreferredSize( null );
d = slider.getPreferredSize();
slider.setSize( d );
panel.setPreferredSize( null );
d = panel.getPreferredSize();
panel.setSize( d );
}
protected static void createAndShowGUI() {
Test1 t = new Test1();
JFrame frame = new JFrame( "Test1" );
frame.getContentPane().add( t );
frame.pack();
frame.setVisible( true );
}
public static void main( String[] args ) {
// try {
// for ( LookAndFeelInfo info :
UIManager.getInstalledLookAndFeels() ) {
// if ( "Nimbus".equals( info.getName() ) ) {
//
UIManager.setLookAndFeel( info.getClassName() );
// break;
// }
// }
// } catch ( Exception e ) {
// System.out.println( "No nimbus found" );
// }
javax.swing.SwingUtilities.invokeLater( new Runnable() {
public void run() {
createAndShowGUI();
}
} );
}
}
--
Fred K