【问题标题】:JSlider rendering with custom LabelTable使用自定义 LabelTable 进行 JSlider 渲染
【发布时间】:2013-01-26 08:07:00
【问题描述】:

我想使用 JSlider 来浏览一些按时间顺序排列的事件,所以我设置了一个自定义 LabelTable 以便它显示一些日期而不是默认的整数值。我的代码是这样的:

JSlider slider = new JSlider();
...
Date[] dates = getDates();
        slider.setModel(new DefaultBoundedRangeModel(0, 0, 0, dates.length - 1));
        Hashtable<Integer, JLabel> ht = new Hashtable<Integer, JLabel>();
        for (int i = 0; i < dates.length; ++i) {
            JLabel label = new JLabel(DateFormat.getDateInstance().format(dates[i]));
            ht.put(i, label);
        }
        slider.setLabelTable(ht);
        slider.setPaintLabels(true);
        slider.setInverted(true);

这很好用,如您所见:

但是,如果我想改变滑块的方向,比如slider.setOrientation(JSlider.HORIZONTAL);,结果如下:

如果我想每隔一个日期在滑块上方显示一个日期/在滑块下方显示一个日期怎么办?另外,我可以在垂直滑块上的滑块左侧显示标签吗?

问候, 雷米

【问题讨论】:

  • 我说得对,请发帖和SSCCE,简短,可运行,可编译,大约JFrameJSliderJSlider 的硬编码值

标签: java swing jslider


【解决方案1】:

更改标签面(只需应用 RTL 方向):

public static void main ( String[] args )
{
    try
    {
        UIManager.setLookAndFeel ( new NimbusLookAndFeel () );
    }
    catch ( UnsupportedLookAndFeelException e )
    {
        e.printStackTrace ();
    }


    JFrame frame = new JFrame ();

    JSlider slider = new JSlider ( SwingConstants.VERTICAL );
    slider.setPaintLabels ( true );
    slider.setComponentOrientation ( ComponentOrientation.RIGHT_TO_LEFT );

    Hashtable<Integer, JLabel> table = new Hashtable<Integer, JLabel> ();
    table.put ( 0, new JLabel ( "May 2, 2000" ) );
    table.put ( 25, new JLabel ( "May 3, 2001" ) );
    table.put ( 50, new JLabel ( "May 4, 2002" ) );
    table.put ( 75, new JLabel ( "May 5, 2003" ) );
    table.put ( 100, new JLabel ( "May 6, 2004" ) );
    slider.setLabelTable ( table );

    frame.add ( slider );

    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

结果:

要改变标签的位置,您必须手动修改它们。 例如,可以这样做:

public static void main ( String[] args )
{
    try
    {
        UIManager.setLookAndFeel ( new NimbusLookAndFeel () );
    }
    catch ( UnsupportedLookAndFeelException e )
    {
        e.printStackTrace ();
    }


    JFrame frame = new JFrame ();
    frame.getRootPane ().setBorder ( BorderFactory.createEmptyBorder ( 5, 5, 5, 5 ) );

    JSlider slider = new JSlider ( SwingConstants.HORIZONTAL );
    slider.setPaintLabels ( true );

    Hashtable<Integer, JLabel> table = new Hashtable<Integer, JLabel> ();
    table.put ( 0, new JLabel ( "May 2, 2000" ) );
    JLabel l2 = new JLabel ( "May 3, 2001" );
    l2.setBorder ( BorderFactory.createEmptyBorder ( 20, 0, 0, 0 ) );
    table.put ( 25, l2 );
    table.put ( 50, new JLabel ( "May 4, 2002" ) );
    JLabel l3 = new JLabel ( "May 5, 2003" );
    l3.setBorder ( BorderFactory.createEmptyBorder ( 20, 0, 0, 0 ) );
    table.put ( 75, l3 );
    table.put ( 100, new JLabel ( "May 6, 2004" ) );
    slider.setLabelTable ( table );

    frame.add ( slider );

    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

结果:

当然,您可以改进该代码,并根据之前的标签首选高度(取自首选尺寸)在标签创建周期中添加边框,每次甚至运行。

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 2018-02-04
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多