1

説明的なラベルを使用してJSlider#setLabelTableを呼び出すと、厄介な問題が発生します。問題は、トラック (通常はすべてのスライダー幅を使用して左右に移動する) が、ラベルの長さのために狭くなることです。

デフォルトでは、スライダーは次のようになります。

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

ただし、カスタム ラベルを使用すると、次のようになります。

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

しかし、私はこのようなものが欲しい:

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

これが可能かどうか知っている人はいますか?アプリケーションが複数の L&F をサポートしているため、これは残念ながらオプションではないBasicSliderUIに関係しています。

私の問題を示す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();
            }
        });
    }
}
4

2 に答える 2

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 が役に立ちます。

于 2011-01-03T03:00:58.223 に答える
0


public Hashtable createStandardLabels( int increment, int start )
独自のバージョンのJSliderを作成し、特にこの行を変更できるメソッドをオーバーライドする必要があると思います
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );

次の場所にあるコードによると:
http://kickjava.com/src/javax/swing/JSlider.java.htm

于 2011-01-02T21:18:57.367 に答える