1

NetBeans 7.2 を使用しています。

に がありJSlider slider_randomJPanel1100、最小値0、最大値を入力しました1000。プロパティ(カスタムコード)を介してtoolTipTextforを設定しました:slider_random

"<html>Range (0-" + String.valueOf(slider_random.getMaximum()) + ")<br>Current: " + String.valueOf(slider_random.getValue())

また、 a を配置し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 が表示されます。

これを修正するための 1 つの解決策は、スライダーにマウス ホバー イベントを作成することです。これにより、アプリケーションを実行してマウス ポインターをスライダーに合わせると、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 に答える