>

JSpinner에 대한 custome 모델을 만들려고 이미 시도했지만 작동하지 않습니다.  코드는 다음과 같습니다.

public class ModelJSpinner implements SpinnerModel
 {
private long value;
private long min;
private long max;
private long increment;
private ChangeListener l;
private ArrayList<ChangeListener> listeners;
@Override
public Object getValue()
{
    return null;
}
public ModelJSpinner(long min, long max, long increment)
{
    super();
    this.min = min;
    this.max = max;
    this.increment = increment;
    setValue(min);
    listeners = new ArrayList<>();
}
@Override
public void setValue(Object value)
{
    if (value == null)
    {
    }else {
        this.value = (Long) value;    
    }

    //fireStateChanged();
}
private void fireStateChanged()
{
    if (listeners == null)
        return;
    for (int a = 0; a < listeners.size(); a++)
    {
        ChangeListener l = (ChangeListener) listeners.get(a);
        try
        {
            l.stateChanged(new ChangeEvent(this));
        }
        catch (RuntimeException e)
        {
            e.printStackTrace();
        }
    }
}
@Override
public Object getNextValue()
{
    Long nextValue = value + increment;
    if (nextValue > max)
    {
        return null;
    }
    else
    {
        return nextValue;
    }
}
@Override
public Object getPreviousValue()
{
    Long previousValue = value - increment;
    if (previousValue < min)
    {
        return null;
    }
    else
    {
        return previousValue;
    }
}
@Override
public void addChangeListener(javax.swing.event.ChangeListener l)
{
    this.l = l;
    listeners.add(l);
}
@Override
public void removeChangeListener(javax.swing.event.ChangeListener l)
{
    if (this.l == l)
    {
        l = null;
    }
    listeners.add(l);
}
}

그러나 다음 코드를 실행할 때 ... 많이하지 않는 JSpinner를 제외하고는 아무것도 얻지 못합니다 ...

public class Test
{
public static void main(String[] args)
{
    ModelJSpinner model = new ModelJSpinner(10L, 20L, 5L);
    JSpinner spinner = new JSpinner(model);
    spinner.setModel(model);
    spinner.setValue(15L);
    JFrame frame = new JFrame("adasasd");
    frame.setSize(350, 150);
    frame.add(spinner);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
}
 }

처음에 JSpinner가 위에서 언급 한 모델로 무언가를 할 수 있다는 것을 알고 싶었고 나중에 Changelisteners를 구현하고 싶었습니다.

현재로서는 제대로 그릴 수조차 없습니다. 누군가 나를 도울 수있는 기회가 있습니까?

JSpinner의 모델로 SpinnerModel을 구현하는 클래스의 인스턴스를 사용해야하며 작동시킬 수 없습니다.

BR DK


  • 답변 # 1

    이것은 실패를 보증합니다 :

    @Override
    public Object getValue()
    {
        return null;
    }
    
    

    이것은 JSpinner가 표시 할 값을 결정하기 위해 사용하는 방법이기 때문입니다.

    대신 value 가 보유한 값을 반환하십시오.  들. 또한 null 를 반환하지 마십시오   getNextValue() 를 위해  다음 값이 최대 값보다 큰 경우 대신 최대 값을 반환하십시오. getPreviousValue() 와 마찬가지로 계산 된 이전 값이 최소값보다 작은 경우 최소값을 반환합니다.

    예를 들어

    public class SpinnerModel3 implements SpinnerModel {
        private long value;
        private long min;
        private long max;
        private long increment;
        // using a set to avoid allowing addition of duplicate listeners
        private Set<ChangeListener> listenerSet = new HashSet<>();
        public SpinnerModel3(long value, long min, long max, long increment) {
            super();
            this.value = value;
            this.min = min;
            this.max = max;
            this.increment = increment;
        }
        @Override
        public void addChangeListener(ChangeListener l) {
            listenerSet.add(l);
        }
        @Override
        public Object getNextValue() {
            long nextValue = value + increment;
            nextValue = Math.min(nextValue, max);
            return nextValue;
        }
        @Override
        public Object getPreviousValue() {
            long prevValue = value - increment;
            prevValue = Math.max(prevValue, min);
            return prevValue;
        }
        @Override
        public Object getValue() {
            return value;
        }
        @Override
        public void removeChangeListener(ChangeListener l) {
            listenerSet.remove(l);
        }
        @Override
        public void setValue(Object value) {
            this.value = (long) value;
            fireStateChanged();
        }   
        protected void fireStateChanged() {
            // create a ChangeEvent object
            ChangeEvent e = new ChangeEvent(this);
            for (ChangeListener l : listenerSet) {
                l.stateChanged(e);  // notify all listeners
            }
        }
    }
    
    

    추상 모델 클래스를 사용할 수있는 경우 (또는 기본 모델 클래스가 더 우수하지만 스피너 모델에 사용할 수없는 경우) 추상 모델 클래스 확장을 사용하는 것이 좋습니다. 그래도 더 좋습니다 :

    @SuppressWarnings("serial")
    public class SpinnerModel2 extends AbstractSpinnerModel {
        private long value;
        private long min;
        private long max;
        private long increment;
        public SpinnerModel2(long value, long min, long max, long increment) {
            super();
            this.value = value;
            this.min = min;
            this.max = max;
            this.increment = increment;
        }
        @Override
        public Object getNextValue() {
            long nextValue = value + increment;
            nextValue = Math.min(nextValue, max);
            return nextValue;
        }
        @Override
        public Object getPreviousValue() {
            long prevValue = value - increment;
            prevValue = Math.max(prevValue, min);
            return prevValue;
        }
        @Override
        public Object getValue() {
            return value;
        }
        @Override
        public void setValue(Object value) {
            this.value = (long) value;
            fireStateChanged();
        }
    }
    
    

  • 이전 grep - PHP 파일에서 소스 코드 만 가져 오기
  • 다음 variables - Kotlin에서 여러 부울을 인쇄 할 수 없습니다