JSlider#setLabelTable,标签让轨道变窄
我在调用 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();
}
});
}
}
I'm having a annoying issue when calling JSlider#setLabelTable with descriptive labels. The problem is that the track (that usually goes from side to side using all of the sliders width) gets narrowed because of the length of the labels.
By default the slider looks like:
##############################################
| | | | | | | | | |
But with custom labels it looks something like this:
############################
| | | | | | | | | |
Low priority High priority (Quick delivery)
But I want something like this:
##############################################
| | | | | | | | | |
Low priority High priority (Quick delivery)
Anyone know if this is possible?
I'm afraid this involves BasicSliderUI which unfortunately isn't an option since the application supports multiple L&Fs.
Here's an SSCCE showing my problem:
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();
}
});
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如您可以在 Swing 组件中使用 HTML,您可以尝试包裹标签以使其更贴合。
附录:您还可以尝试更改标签的水平对齐方式。
附录:另一种方法可能是在滑块本身上使用短标签,并在附近添加解释性图例。如果您必须实现自定义组件,我找到了 Kirill Grouchnikov 的 如何编写自定义 Swing 组件 有帮助。
As you can Use HTML in Swing Components, you might try wrapping the labels to fit better.
Addendum: You also might try altering the label's horizontal alignment.
Addendum: Another approach might be to use short labels on the slider itself and add an explanatory legend nearby. If you have to implelent a custom component, I found Kirill Grouchnikov's How to Write a Custom Swing Component helpful.
我认为你必须制作自己的 JSlider 版本并覆盖方法
public Hashtable createStandardLabels(intincrement,intstart)
特别是这条线已准备好进行更改
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );
根据代码:
http://kickjava.com/src/javax/swing/JSlider.java.htm
I think you will have to make your own version of JSlider and override method
public Hashtable createStandardLabels( int increment, int start )
where specially this line is ready for changes
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );
according to code found at:
http://kickjava.com/src/javax/swing/JSlider.java.htm