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