5

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);、結果は次のようになります。 ここに画像の説明を入力

たとえば、スライダーの 1 つ上または 1 つ下の日付を 1 日おきに表示したい場合はどうすればよいでしょうか? また、垂直スライダーのスライダーの左側にラベルを表示することはできますか?

よろしく、レミ

4

1 に答える 1

7

ラベル側の変更 (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 );
}

結果:

ここに画像の説明を入力

もちろん、そのコードを改善し、実行するたびにラベル作成サイクルで以前のラベルの優先高さ (優先サイズから取得) に従って境界線を追加することもできます。

于 2013-02-11T09:03:01.287 に答える