Pregunta

Estoy teniendo un problema molesto cuando se llama JSlider # setLabelTable con etiquetas descriptivas. El problema es que la pista (que por lo general va de lado a lado el uso de todos los reguladores de anchura) se redujo debido a la longitud de las etiquetas.

Por defecto, las miradas deslizables como:

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

Pero con etiquetas personalizadas que se ve algo como esto:

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

Pero quiero algo como esto:

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

Alguien sabe si esto es posible? Me temo que esto implica BasicSliderUI que, desgraciadamente, no es una opción ya que la aplicación es compatible con múltiples L & Fs.

Aquí hay un SSCCE mostrando mi 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();
            }
        });
    }
}
¿Fue útil?

Solución

Como se puede Uso de HTML en componentes Swing , es posible que trate de envolver las etiquetas para ajustarse mejor.

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

Adición:. También podría tratar de alterar la alineación horizontal de la etiqueta

Adición: Otro enfoque podría ser el uso de etiquetas cortas en el propio regulador y añadir una leyenda explicativa cerca. Si usted tiene que implelent un componente personalizado, me encontré con Kirill Grouchnikov Cómo escribir una oscilación personalizado Componente útiles.

Otros consejos

Creo que tendrá que hacer su propia versión de JSlider y método de reemplazo
public Hashtable createStandardLabels( int increment, int start )
donde especialmente esta línea está listo para los cambios
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );

según el código que se encuentra en:
http://kickjava.com/src/javax/swing/JSlider.java.htm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top