我使用NetBeans 7.2。
我的JSlider slider_random
中有JPanel1
,输入值100
,最小值0
,最大值1000
。我通过属性(自定义代码)为toolTipText
设置slider_random
:
"<html>Range (0-" + String.valueOf(slider_random.getMaximum()) + ")<br>Current: " + String.valueOf(slider_random.getValue())
同时放置JTextField text_current
并将文字设置为100
,这会在我更改时显示slider_random
的值。
我将stateChanged
事件设置为slider_random
:
private void slider_randomStateChanged(javax.swing.event.ChangeEvent evt) {
slider_random.setToolTipText("<html>Range (0-" + String.valueOf(slider_random.getMaximum()) + ")<br>Current: " + String.valueOf(slider_random.getValue()));
jTextField1.setText(String.valueOf(slider_random.getValue()));
}
我的问题是当我启动程序并指向它显示的滑块时:
范围(0-1000)
当前:50
然后稍微移动滑块,然后移回原始位置(同时我可以看到text_current
中的更改)所有数据都变得正确,工具提示说:
范围(0-1000)
当前:100
什么可能导致我的问题?
答案 0 :(得分:3)
我能够重新解决你的问题。
问题是jSlider的默认值是50.您将值修改为100,但这并未反映在jSlider的setToolTip()方法中,您可以在该方法中访问jSlider的值(通过自定义代码)。它会显示旧值50.
要解决此问题,一种解决方案是在滑块上创建鼠标悬停事件,以便在运行应用程序并将鼠标指针悬停在滑块上时,jToolTip方法会选择最新值并显示相同的值。它对我有用,所以我相信它对你有用。
如果我能想到一个更好的解决方案,我会发布相同的。
答案 1 :(得分:1)
在滑块的值已经设置之后,可能会添加侦听器。您可能需要更改订单。或者,只是为了解决初始化问题,您可能需要在初始化滑块后明确设置工具提示。
作为替代方案,您可以继承JSlider
并覆盖getToolTipText
,例如:
JSlider slider = new JSlider() {
public String getToolTipText(MouseEvent e) {
return "<html>Range (0-" + String.valueOf(getMaximum()) + ")<br>Current: " + String.valueOf(getValue());
}
};
这是一个简短的演示:
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSlider;
public class TestSlider {
public static void main(String[] args) {
JFrame frame = new JFrame("TestSlider");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JSlider slider = new JSlider() {
public String getToolTipText(MouseEvent e) {
return "<html>Range (0-" + String.valueOf(getMaximum())
+ ")<br>Current: " + String.valueOf(getValue());
}
};
slider.setToolTipText("");
frame.add(slider);
((JComponent) frame.getContentPane()).setBorder(BorderFactory
.createEmptyBorder(10, 10, 10, 10));
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
}
答案 2 :(得分:0)
我认为执行此操作的最佳方法是在滑块附近创建一个标签,然后将变量设置为整数而不是“y”,或者将get值设置为“y”,&amp;您需要的事件是项目状态更改,因此当您移动滑块时,标签将随滑块移动而移动。将显示值;)
public class Slidebar extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Slidebar frame = new Slidebar();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Slidebar() {
setResizable(false);
setTitle("SlideBar With Text Move");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 317, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
final JSlider slider = new JSlider();
slider.setPaintLabels(true);
slider.setOrientation(SwingConstants.VERTICAL);
slider.setValue(0);
slider.setBounds(131, 60, 53, 136);
contentPane.add(slider);
final JLabel lblNewLabel = new JLabel("");
int y = 165;
lblNewLabel.setBounds(111, 173, 41, 30);
contentPane.add(lblNewLabel);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
int y=165;
lblNewLabel.setBounds(111, y-(slider.getValue())-5, 41, 30);
lblNewLabel.setText(slider.getValue()+"");
}
});
}
}