1

...または多分私のプログラミングは奇妙な振る舞いです...

プログラムでよく使うクラスを作ろうとしています。これは、あるペインの上部にJlabelを含み、別のペインにJSliderとJSpinnerを含むJPanelコントロールを作成するクラスです。JSliderが変更されたときにJSpinnerを変更したいのですが、その逆も同様です。私はそれらの価値を互いに結びつけて欲しいのです。これは、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メソッドを終了することすらできないと判断しました。main関数に戻るだけです。スライダーノブが動きます。スピナーの値は変わりません。getValueIsAdjustingテスト内でダイアログボックスを開くこともできました。getValueIsAdjustingテストのelse条件としてダイアログボックスを開こうとしましたが、どちらのダイアログボックスも開きません。stateChanged()から戻るだけです。

スライダーまたはスピナーのどちらが原因でstateChangedが呼び出されたかを判断するためのより良い方法を使用できます。

4

1 に答える 1

2

SpinSliderこのコンテキストで役立つ場合があります。

画像

于 2013-02-21T16:53:24.980 に答える