... или, может быть, мое программирование - это странное поведение...
Я пытаюсь создать класс, который я часто использую в своей программе. Это класс, который создает элемент управления 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 из-за ползунка или счетчика.