Domanda

Ho un problema fastidioso quando si chiama JSlider # setLabelTable con etichette descrittive. Il problema è che la pista (che di solito va da lato a lato con tutti i cursori larghezza) viene ridotto a causa della lunghezza delle etichette.

Per impostazione predefinita gli sguardi di scorrimento come:

##############################################
|    |    |    |    |    |    |    |    |    |

Ma con etichette personalizzate sembra qualcosa di simile:

     ############################
     |  |  |  |  |  |  |  |  |  |
Low priority     High priority (Quick delivery)

Ma io voglio qualcosa di simile:

##############################################
|    |    |    |    |    |    |    |    |    |
Low priority                                 High priority (Quick delivery)

Qualcuno sa se questo è possibile? Ho paura che questo comporta BasicSliderUI che purtroppo non è un'opzione in quanto l'applicazione supporta più L & Fs.

Ecco un SSCCE mostrando il mio problema:

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();
            }
        });
    }
}
È stato utile?

Soluzione

Come si può Usa HTML in Swing Componenti , si potrebbe provare avvolgendo le etichette per adattarsi meglio.

labels.put(1, new JLabel("<html>Low<br>priority</html>"));
labels.put(10, new JLabel("<html>High priority<br>(Quick delivery)</html>"));

Addendum:. Si potrebbe anche provare a modificare l'allineamento orizzontale del marchio

Addendum: Un altro approccio potrebbe essere quello di utilizzare brevi etichette sul cursore stesso e aggiungere una leggenda esplicativo nelle vicinanze. Se si deve implelent un componente personalizzato, ho trovato di Kirill Grouchnikov Come scrivere uno swing personalizzato Componente utile.

Altri suggerimenti

Penso che si dovrà fare la propria versione di JSlider e metodo di sostituzione
public Hashtable createStandardLabels( int increment, int start )
dove specialmente questa linea è pronto per le modifiche
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );

in base al codice che si trova all'indirizzo:
http://kickjava.com/src/javax/swing/JSlider.java.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top