JSlider # setLabelTable, étiquettes font de plus étroit de la piste
Question
Je vais avoir un problème gênant lorsque vous appelez JSlider # setLabelTable avec des étiquettes descriptives. Le problème est que la piste (qui va généralement d'un côté à côté en utilisant tous les curseurs largeur) se rétrécit en raison de la longueur des étiquettes.
Par défaut, les regards de curseur comme:
##############################################
| | | | | | | | | |
Mais avec des étiquettes personnalisées, il ressemble à ceci:
############################
| | | | | | | | | |
Low priority High priority (Quick delivery)
Mais je veux quelque chose comme ceci:
##############################################
| | | | | | | | | |
Low priority High priority (Quick delivery)
Quelqu'un sait si cela est possible? Je crains que cela implique BasicSliderUI qui est malheureusement pas une option car l'application prend en charge plusieurs l & Fs.
Voici un SSCCE montrant mon problème:
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
public class JSliderLabelTableProblem
{
public JSliderLabelTableProblem()
{
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setBounds(new Rectangle(200, 200, 400, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createNormalSlider(), BorderLayout.NORTH);
frame.add(createSliderWithLabels(), BorderLayout.SOUTH);
frame.setVisible(true);
}
private JSlider createNormalSlider()
{
JSlider slider = new JSlider();
slider.setMinimum(1);
slider.setMaximum(10);
slider.setMajorTickSpacing(1);
slider.setSnapToTicks(true);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
return slider;
}
private JSlider createSliderWithLabels()
{
JSlider slider = createNormalSlider();
Dictionary<Integer, JComponent> labels = new Hashtable<Integer, JComponent>();
labels.put(1, new JLabel("Low priority"));
labels.put(10, new JLabel("High priority (Quick delivery)"));
slider.setLabelTable(labels);
return slider;
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new JSliderLabelTableProblem();
}
});
}
}
La solution
Comme vous pouvez Utiliser HTML dans les composants Swing , vous pouvez essayer d'envelopper les étiquettes pour mieux adapter.
labels.put(1, new JLabel("<html>Low<br>priority</html>"));
labels.put(10, new JLabel("<html>High priority<br>(Quick delivery)</html>"));
Addendum:. Vous pouvez également essayer de modifier l'alignement horizontal de l'étiquette
Addendum: Une autre approche pourrait consister à utiliser des étiquettes courtes sur le curseur lui-même et ajouter une légende explicative à proximité. Si vous devez implelent un composant personnalisé, je l'ai trouvé Kirill Grouchnikov Comment écrire un composant swing personnalisé utile.
Autres conseils
Je pense que vous devrez faire votre propre version de JSlider et écrasent les méthodes de
public Hashtable createStandardLabels( int increment, int start )
où spécialement cette ligne est prêt pour les changements
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );
selon le code trouvé à:
http://kickjava.com/src/javax/swing/JSlider.java.htm