java+;swing+;mvc:如何制作一个带有多个控件的接口模型?

java+;swing+;mvc:如何制作一个带有多个控件的接口模型?,java,model-view-controller,swing,Java,Model View Controller,Swing,我有一个正在开发的Swing应用程序,它有一对JSliders和JTextFields,可以显示和控制两个数字的值。现在,我把一些东西拼凑在一起,让它工作起来,拦截更改事件并更新显示。然而,我认为更好的方法是创建一个具有两个数字的模型,并以某种方式将该模型链接到我的GUI视图。我知道如何制作模型,但我对如何将其链接到我的GUI视图有点迷茫。。。有什么建议吗 更新:我的模型准备就绪+包括启动属性更改。我想我想使用某种数据绑定方法(例如JGoodies绑定),但我不确定如何。。。JGoodies绑定

我有一个正在开发的Swing应用程序,它有一对JSliders和JTextFields,可以显示和控制两个数字的值。现在,我把一些东西拼凑在一起,让它工作起来,拦截更改事件并更新显示。然而,我认为更好的方法是创建一个具有两个数字的模型,并以某种方式将该模型链接到我的GUI视图。我知道如何制作模型,但我对如何将其链接到我的GUI视图有点迷茫。。。有什么建议吗

更新:我的模型准备就绪+包括启动属性更改。我想我想使用某种数据绑定方法(例如JGoodies绑定),但我不确定如何。。。JGoodies绑定不支持滑块

编辑:还要注意,当滑块改变位置时,文本字段应该改变其值;当文本字段改变值时,滑块应改变位置;当模型更改值时,两个文本字段+滑块都应更新


您可以定义模型并将其传递给构造函数中的视图

尚未尝试该代码,但可能是这样的:

public class MyView extends JPanel /*JFrame, whatever*/ {
    private MyModel myModel;

    public MyView(MyModel myModel) {
        this.myModel = myModel;
        // build GUI
        // ...
        textfield1.setText(String.valueOf(myModel.getValue1()));
    }

    // this is what you do when a control changes:
    public void value1Changed(int newValue) {
        myModel.setValue1(newVvalue);
    }
}

public class MyModel {
    private int value1;

    // getters, setters
    // ...
}

要保持这两个组件的同步,只需让每个组件更新另一个组件即可。下面是一个连接和的示例:


隐马尔可夫模型。。。谢谢,我去看看。我认为这个问题可能与我的例子中的浮点->整数->浮点转换有关。这可能很关键。将每个组件视为模型的有限分辨率视图,其中包含完整分辨率值。文本字段可能使用十进制格式显示值;滑块的分辨率仅限于屏幕的分辨率。
public class SpinSlider extends JPanel {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("SpinSlider");
                frame.add(new SpinSlider());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public SpinSlider() {
        this.setLayout(new FlowLayout());
        final JSpinner spinner = new JSpinner();
        final JSlider slider = new JSlider();
        slider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                JSlider s = (JSlider) e.getSource();
                spinner.setValue(s.getValue());
            }
        });
        this.add(slider);
        spinner.setModel(new SpinnerNumberModel(50, 0, 100, 1));
        spinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                JSpinner s = (JSpinner) e.getSource();
                slider.setValue((Integer) s.getValue());
            }
        });
        this.add(spinner);
    }
}