我有一个正在使用的Swing应用程序,它具有一对同时显示和显示JSliders和JTextField的对象.控制两个数字的值.现在,我将各种东西融合在一起以使其正常工作,拦截更改事件并更新显示.但是,我在想一种更好的方法是制作一个具有两个数字的模型,并以某种方式将此模型链接到我的GUI视图.我知道如何制作模型,但是对于如何将其链接到GUI视图有点迷lost……有什么建议吗?
更新:我的模型已准备就绪,包括触发属性更改.我想我想使用某种数据绑定方法(例如JGoodies Binding),但是我不确定如何… JGoodies Binding不支持滑块.
编辑:还请注意,当滑块更改位置时,文本字段应更改其值;当文本字段更改值时,滑块应更改位置;当模型更改值时,两个文本字段滑块都应更新.
最佳答案
为了使两个组件保持同步,只需让每个组件的EventListener更新另一个组件即可.这是连接JSlider和JSpinner的示例:
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);
}
}