1

我使用 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

什么会导致我的问题?

这是我启动后的屏幕截图。

4

3 回答 3

3

我能够重现您的问题。

问题是 jSlider 的默认值为 50。您将值修改为 100,但这并未反映在您访问 jSlider 值的 jSlider 的 setToolTip() 方法中(通过自定义代码)。它将显示旧值 50。

为了纠正这个问题,一种解决方案是在滑块上创建鼠标悬停事件,这样当您运行应用程序并将鼠标指针悬停在滑块上时,jToolTip 方法会选择最新的值并向您显示相同的值。它对我有用,所以我相信它对你有用。

如果我能想到更好的解决方案,我会发布相同的。

于 2012-10-24T21:32:36.060 回答
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);
    }
}
于 2012-10-24T21:55:45.757 回答
0

我认为执行此操作的最佳方法是在滑块附近制作一个标签,然后放置一个整数之类的变量而不是“y”或放置获取值而不是“y”,以及您需要的事件是项目状态更改,因此当您移动滑块时,标签将随滑块移动并显示值;)

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()+"");

        }
    });






}

}

于 2013-07-30T22:33:03.507 回答