У меня есть это приложение Swing, над которым я работаю, в котором есть пара JSliders и JTextFields, которые отображают и контролируют значение двух чисел. Прямо сейчас я как бы взломал все вместе, чтобы заставить его работать, перехватывая события изменений и обновляя отображение. Однако я думаю, что лучшим способом было бы создать модель с двумя числами и каким-то образом связать эту модель с моим графическим интерфейсом. Я знаю, как сделать модель, но я немного не понимаю, как связать это с моим графическим интерфейсом... есть предложения?
обновление: моя модель готова + включает изменения свойств активации. Я думаю, что хотел бы использовать какой-то подход к привязке данных (например, JGoodies Binding), но я не уверен, как это сделать... JGoodies Binding не поддерживает ползунки.
Редактировать: также обратите внимание, когда ползунок меняет положение, текстовое поле должно изменить свое значение; при изменении значения текстового поля ползунок должен изменить положение; и когда модель меняет значение, текстовое поле + ползунок должны обновляться.
2 ответа
Чтобы два компонента были синхронизированы, просто используйте EventListener для каждого из них. обновить другой. Вот пример соединения JSlider и < a href="http://java.sun.com/javase/6/docs/api/javax/swing/JSpinner.html" rel="nofollow noreferrer">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);
}
}
Вы можете определить свою модель и передать ее в представление в конструкторе.
Код не пробовал, но он может выглядеть так:
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
// ...
}
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.