У меня есть это приложение Swing, над которым я работаю, в котором есть пара JSliders и JTextFields, которые отображают и контролируют значение двух чисел. Прямо сейчас я как бы взломал все вместе, чтобы заставить его работать, перехватывая события изменений и обновляя отображение. Однако я думаю, что лучшим способом было бы создать модель с двумя числами и каким-то образом связать эту модель с моим графическим интерфейсом. Я знаю, как сделать модель, но я немного не понимаю, как связать это с моим графическим интерфейсом... есть предложения?

обновление: моя модель готова + включает изменения свойств активации. Я думаю, что хотел бы использовать какой-то подход к привязке данных (например, JGoodies Binding), но я не уверен, как это сделать... JGoodies Binding не поддерживает ползунки.

Редактировать: также обратите внимание, когда ползунок меняет положение, текстовое поле должно изменить свое значение; при изменении значения текстового поля ползунок должен изменить положение; и когда модель меняет значение, текстовое поле + ползунок должны обновляться.

alt text

1
Jason S 28 Дек 2009 в 15:21

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);
    }
}
2
trashgod 28 Дек 2009 в 18:54
Хм... спасибо, посмотрю. Я думаю, что проблема может быть связана с преобразованием с плавающей запятой -> целое число -> с плавающей запятой в моем случае.
 – 
Jason S
29 Дек 2009 в 03:57
Это может быть критично. Думайте о каждом компоненте как о представлении вашей модели с ограниченным разрешением, которое содержит значение полного разрешения. Текстовое поле может отображать значение с использованием DecimalFormat; разрешение ползунка ограничено разрешением экрана.
 – 
trashgod
29 Дек 2009 в 06:26

Вы можете определить свою модель и передать ее в представление в конструкторе.

Код не пробовал, но он может выглядеть так:

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
    // ...
}
1
Peter Lang 28 Дек 2009 в 15:37