Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义JSpinner模型不工作_Java_Swing_Jspinner_Changelistener - Fatal编程技术网

Java 自定义JSpinner模型不工作

Java 自定义JSpinner模型不工作,java,swing,jspinner,changelistener,Java,Swing,Jspinner,Changelistener,我尝试实现自己的JSpinner模型来接受枚举(包括I18N),因此我喜欢这样: searchSpinner.setModel(new AbstractSpinnerModel() { int index = 0; int minIndex = 0; int maxIndex = MY_ENUM.values().length - 1; Object selected = MY_ENUM.values()[index]; @Override p

我尝试实现自己的
JSpinner
模型来接受
枚举
(包括
I18N
),因此我喜欢这样:

searchSpinner.setModel(new AbstractSpinnerModel() {

    int index = 0;
    int minIndex = 0;
    int maxIndex = MY_ENUM.values().length - 1;
    Object selected = MY_ENUM.values()[index];

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

    @Override
    public void setValue(Object value) {
        selected = value;
        fireStateChanged();
    }

    @Override
    public Object getNextValue() {
        if (index < maxIndex) {
            index++;
        }
        fireStateChanged();
        return MY_ENUM.values()[index];
    }

    @Override
    public Object getPreviousValue() {
        if (index > minIndex) {
            index--;
        }
        fireStateChanged();
        return MY_ENUM.values()[index];
    }

    @Override
    public void addChangeListener(ChangeListener l) {

    }

    @Override
    public void removeChangeListener(ChangeListener l) {

    }
});
searchSpinner.setModel(新的AbstractSpinnerModel(){
int指数=0;
int minIndex=0;
int maxIndex=MY_ENUM.values().length-1;
所选对象=我的枚举值()[index];
@凌驾
公共对象getValue(){
返回选中的;
}
@凌驾
公共无效设置值(对象值){
所选=值;
fireStateChanged();
}
@凌驾
公共对象getNextValue(){
如果(索引<最大索引){
索引++;
}
fireStateChanged();
返回我的_ENUM.values()[index];
}
@凌驾
公共对象getPreviousValue(){
如果(索引>最小索引){
索引--;
}
fireStateChanged();
返回我的_ENUM.values()[index];
}
@凌驾
公共无效addChangeListener(ChangeListener l){
}
@凌驾
public void removeChangeListener(ChangeListener l){
}
});
问题是它不起作用,甚至微调器列表看起来也像是禁用的。我做错了什么

更新:根据第一个答案

你应该扩展到(注意他的问题的新成员——注意他最初的问题有一个实现SpinnerModel接口的类。他后来更改了他的代码以反映我的建议)并确保在适当的时候调用
fireStateChanged()
方法。此外,您还没有考虑边缘情况和超出边缘的情况

e、 g

import javax.swing.*;
导入javax.swing.JSpinner.DefaultEditor;
公共类MySpinnerPanel扩展了JPanel{
公共静态void main(字符串[]args){
JSpinner微调器=新的JSpinner(新的MyEnumSpinnerModel());
JSpinner.DefaultEditor=(DefaultEditor)spinner.getEditor();
editor.getTextField().setColumns(5);
JPanel面板=新的JPanel();
panel.add(微调器);
showMessageDialog(空,面板);
}
}
髓鞘{
FE、FI、FO、FUM、FOO、FUBAR、SPAM
}
类MyEnumSpinnerModel扩展了AbstractSpinnerModel{
私有整数指数=0;
@凌驾
公共对象getValue(){
返回MyEnum.values()[index];
}
@凌驾
公共无效设置值(对象值){
if(MyEnum的值instanceof){
索引=((MyEnum)值).ordinal();
fireStateChanged();
}否则{
字符串text=value.toString()+“不是有效的枚举项”;
抛出新的IllegalArgumentException(文本);
}
}
@凌驾
公共对象getNextValue(){
如果(索引>=MyEnum.values().length-1){
返回null;
}否则{
返回MyEnum.values()[index+1];
}
}
@凌驾
公共对象getPreviousValue(){
if(index您应该从(注意,他的问题的新成员——注意,他最初的问题有一个实现SpinnerModel接口的类。他后来更改了代码以反映我的建议)扩展,并确保调用
fireStateChanged()
方法。此外,您没有考虑边缘情况和超出边缘情况

e、 g

import javax.swing.*;
导入javax.swing.JSpinner.DefaultEditor;
公共类MySpinnerPanel扩展了JPanel{
公共静态void main(字符串[]args){
JSpinner微调器=新的JSpinner(新的MyEnumSpinnerModel());
JSpinner.DefaultEditor=(DefaultEditor)spinner.getEditor();
editor.getTextField().setColumns(5);
JPanel面板=新的JPanel();
panel.add(微调器);
showMessageDialog(空,面板);
}
}
髓鞘{
FE、FI、FO、FUM、FOO、FUBAR、SPAM
}
类MyEnumSpinnerModel扩展了AbstractSpinnerModel{
私有整数指数=0;
@凌驾
公共对象getValue(){
返回MyEnum.values()[index];
}
@凌驾
公共无效设置值(对象值){
if(MyEnum的值instanceof){
索引=((MyEnum)值).ordinal();
fireStateChanged();
}否则{
字符串text=value.toString()+“不是有效的枚举项”;
抛出新的IllegalArgumentException(文本);
}
}
@凌驾
公共对象getNextValue(){
如果(索引>=MyEnum.values().length-1){
返回null;
}否则{
返回MyEnum.values()[index+1];
}
}
@凌驾
公共对象getPreviousValue(){

如果(索引,则应使用
ChangeListener
通知模型中的更改视图

spinner = new JSpinner(new SpinnerModel() {
    private ChangeListener l;

    @Override
    public void setValue(Object value) {
        ...

        if(l != null) {
            l.stateChanged(new ChangeEvent(this));
        }
    }

    ...

    @Override
    public void addChangeListener(ChangeListener l) {
        this.l = l;
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        if(this.l == l) {
            this.l = null;
        }
    }
});

编辑:您可以使用列表注册多个侦听器。

您应该使用
ChangeListener
通知模型中的更改视图

spinner = new JSpinner(new SpinnerModel() {
    private ChangeListener l;

    @Override
    public void setValue(Object value) {
        ...

        if(l != null) {
            l.stateChanged(new ChangeEvent(this));
        }
    }

    ...

    @Override
    public void addChangeListener(ChangeListener l) {
        this.l = l;
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        if(this.l == l) {
            this.l = null;
        }
    }
});

编辑:您可以使用列表注册多个侦听器。

只需将此:if(this.l==l)更改为if(this.l!=l),你的答案很好。这不是一个错误。要正确删除侦听器,它必须提交给同一个侦听器。在这种情况下,没有太多问题,但如果指出删除了什么内容非常重要。这个答案是不正确的,因为模型不应该要求侦听器通知它自己的更改。正确的解决方案是触发e通知方法。此方法是模型的一部分。我说的是基本接口的直接实现,您使用它的实现,它有一个通知侦听器的方法。请参阅“编辑我的答案”以及“源代码”以了解此答案不正确的原因。另请参阅以了解如何o扩展抽象Swing模型,特别是“触发数据更改事件”部分,你的答案很好。这不是一个错误。要正确删除一个侦听器,它必须提交给同一个侦听器。在这种情况下,没有太多问题,但如果指出删除了什么内容非常重要。此answ