JSlider #setLabelTable,标签使轨道更窄

时间:2011-01-02 21:09:14

标签: java swing jslider

使用描述性标签调用JSlider#setLabelTable时,我遇到了一个恼人的问题。问题是由于标签的长度,轨道(通常使用所有滑块宽度从一侧到另一侧)变窄。

默认情况下,滑块如下所示:

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

但是使用自定义标签时,它看起来像这样:

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

但我想要这样的事情:

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

任何人都知道这是否可行? 我担心这会涉及BasicSliderUI,遗憾的是这不是一个选项,因为该应用程序支持多个L& Fs。

这是显示我的问题的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 个答案:

答案 0 :(得分:2)

尽可能Use HTML in Swing Components,您可以尝试包装标签以更好地适应。

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

附录:您也可以尝试更改标签的水平对齐方式。

附录:另一种方法可能是在滑块本身上使用短标签并在附近添加说明性图例。如果您必须实现自定义组件,我发现Kirill Grouchnikov的How to Write a Custom Swing Component很有帮助。

答案 1 :(得分:0)

我认为您必须制作自己的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