JSlider getValueIsAdjusting странное поведение

... или, может быть, мое программирование - это странное поведение...

Я пытаюсь создать класс, который я часто использую в своей программе. Это класс, который создает элемент управления JPanel, содержащий Jlabel вверху на одной панели и JSlider и JSpinner на другой панели. Я хочу, чтобы JSpinner менялся при изменении JSlider и наоборот. Я хочу, чтобы их ценность была привязана друг к другу. Это сделано для тонкой настройки JSpinner выбора JSpinner.

Вот код класса (импорт ij предназначен для правительственного приложения ImageJ):

import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

 public class LabeledSliderSpinner extends JPanel implements ChangeListener {

JPanel sspanel = new JPanel();
JSlider slider;
SpinnerModel model;
JSpinner spinner;

public LabeledSliderSpinner() {}

public LabeledSliderSpinner(String label, int left, int x, int right) {

    JLabel sslabel = new JLabel(label);

    JSlider slider = new JSlider(JSlider.HORIZONTAL, left, right, x);
    slider.setMajorTickSpacing(25);
    slider.setMinorTickSpacing(5);
    slider.setPaintTicks(true);
    slider.setPaintLabels(true);
    slider.setPaintTrack(true);
    slider.setVisible(true);

    slider.addChangeListener(this);

    model = new SpinnerNumberModel(x, left, right, 1);
    JSpinner spinner = new JSpinner(model);
    spinner.setEditor(new JSpinner.NumberEditor(spinner, "####"));

    spinner.addChangeListener(this);

    sspanel.add(slider);
    sspanel.add(spinner);

    add(sslabel);
    add(sspanel);
    setVisible(true);
}

public void stateChanged(ChangeEvent e) {
    String a = "";

    Object o = e.getSource();
    Class c = o.getClass();
    String controlName = c.getName();


    if (controlName == "javax.swing.JSpinner") {
// not coded yet
    }

    else 

    if (controlName == "javax.swing.JSlider") {
        if (!slider.getValueIsAdjusting()) {
            int fps = (int)slider.getValue();
            spinner.setValue(new Integer(fps));
        }
    }

}
}

Это называется так:

LabeledSliderSpinner lss = new LabeledSliderSpinner("Homing Line", minx, x, maxx);

В методе stateChanged я определил, что когда он достигает теста getValueIsAdjusting, он даже не завершает метод stateChanged. Он просто возвращается к основной функции. Ручка ползунка перемещается. Значение счетчика не меняется. Я даже открыл диалоговое окно в тесте getValueIsAdjusting. Это никогда не происходит. Я попытался открыть диалоговое окно в качестве другого условия для теста getValueIsAdjusting, и он никогда не открывает ни одно диалоговое окно. Он просто возвращается из stateChanged().

Я мог бы использовать лучший способ определить, вызывается ли stateChanged из-за ползунка или счетчика.


person PDog    schedule 21.02.2013    source источник


Ответы (1)


SpinSlider может оказаться полезным в этом контексте.

изображение

person trashgod    schedule 21.02.2013
comment
Это прекрасно работает! Спасибо. Я до сих пор думаю, что было не так с моей. - person PDog; 22.02.2013
comment
Пожалуйста. Я не уверен, но я думаю, что вам тоже нужны корректирующие изменения. - person trashgod; 22.02.2013