JSlider # setLabelTable, метки делают дорожку уже - PullRequest
1 голос
/ 03 января 2011

У меня раздражающая проблема при вызове JSlider # setLabelTable с описательными метками.Проблема в том, что дорожка (которая обычно идет из стороны в сторону, используя всю ширину ползунков) сужается из-за длины меток.

По умолчанию ползунок выглядит следующим образом:

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

Но с пользовательскими метками это выглядит примерно так:

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

Но я хочу что-то вроде этого:

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

Кто-нибудь знает, возможно ли это?Боюсь, что это включает BasicSliderUI , который, к сожалению, не подходит, поскольку приложение поддерживает несколько L & F.

Вот SSCCE , показывающий мою проблему:

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();
            }
        });
    }
}

Ответы [ 2 ]

2 голосов
/ 03 января 2011

Как вы можете Использовать HTML в компонентах Swing , вы можете попробовать обернуть ярлыки так, чтобы они лучше подходили.

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

Добавление: Вы также можете попробовать изменитьгоризонтальное выравнивание метки.

Добавление: Другой подход может заключаться в использовании коротких меток на самом слайдере и добавлении пояснительной легенды поблизости.Если вам нужно реализовать пользовательский компонент, я нашел полезным Как написать пользовательский компонент Swing Кирилла Гручникова .

0 голосов
/ 03 января 2011

Я думаю, вам придется сделать свою собственную версию JSlider и переопределить метод
public Hashtable createStandardLabels( int increment, int start )
, где специально эта строка готова к изменениям
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );

в соответствии с кодомнайдено по адресу:
http://kickjava.com/src/javax/swing/JSlider.java.htm

...