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();
            }
        });
    }
}
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top