powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Слушатель для JSpinner
23 сообщений из 23, страница 1 из 1
Слушатель для JSpinner
    #38256552
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени! Возможно, задам сейчас всем надоевший вопрос, но сам не могу найти ответа, уж простите новичка. Проблема такова - хотелось бы заставить JSpinner реагировать на изменение значения методом набора с клавиатуры. Значение, набранное таким образом, присваивается лишь в том случае, если кликнуть по какому-то другому элементу или при нажатии Enter. А хотелось бы чтобы оно присваивалось сразу, без указанных манипуляций. Пробовал такой пример:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                JComponent comp = mySpinner.getEditor();
                JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
                DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
                formatter.setCommitsOnValidEdit(true);

                mySpinner.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        logger.info("value changed: " + mySpinner.getValue());
                    }
                });



- не получается, реакция только при нажатии Enter Мог бы кто-то объяснить, в чем проблема? Заранее благодарю!
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38256693
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели никто не сталкивался с таким? Ни в жизнь не поверю!
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38256717
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПолуламерНеужели никто не сталкивался с таким? Ни в жизнь не поверю!
Spinner редко используется. А там Formatter точно пропускает значение до окончания ввода?
Выложи запускабельный тест, я подебажу.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38256829
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, собственно, запускал пример по этой ссылке:

http://kulibaba.net/programming/java/listener/swing.jspinner

Реагирует только на переключения стрелок на JSpinner или нажатие Enter, "путем ввода с клавиатуры" молчит как рыба об лед. А какая альтернатива для JSpinner, если он так редко используется? Для текущего задания нужен именно такой контрол, со стрелками, с границами, с шагом, есть что-то другое такого же плана?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38256895
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПолуламерЯ, собственно, запускал пример по этой ссылке:

http://kulibaba.net/programming/java/listener/swing.jspinner

Реагирует только на переключения стрелок на JSpinner или нажатие Enter, "путем ввода с клавиатуры" молчит как рыба об лед. А какая альтернатива для JSpinner, если он так редко используется? Для текущего задания нужен именно такой контрол, со стрелками, с границами, с шагом, есть что-то другое такого же плана?
Не очень понятен и смысл такого запроса. Т.е. надо ввести 123.
Нажимаем 1 - UI обновляется для значения 1
Нажимаем 2 - UI обновляется для значения 12
Нажимаем 3 - UI обновляется для значения 123
Зачем два раза реагировать на два неполноценных значения?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38256912
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так работает.
Код: java
1.
2.
3.
4.
        
JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) spinner.getEditor();
DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
formatter.setCommitsOnValidEdit(true);


У вас идея верная, но вы даже не удосужились сообщить что там исключение.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38257001
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz , благодарю - сейчас JSpinner действительно делает то, что хотелось. Если что-то недосказал в своем сумбурном вопросе - извините, это не со зла
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38257078
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон - я чуть поторопился, теперь вынужден еще раз побеспокоить. Не подскажете, как эту отлаженную методу (которая отлично работает в виде отдельной программы) прицепить к JSpinner в вызываемом немодальном диалоге? Перепробовал несколько вариантов - нуль-реакция при вводе с клавиатуры.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38258081
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сдаюсь, ничего не получается с этим JSpinner в диалоге - не реагирует на ввод с клавиатуры. Объясните, пожалуйста, что не так?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38258214
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Родной swing-овский слушатель, которого присвоил этому JSpinner-компоненту, заменяет при вызове у formatter в свойстве commitOnEdit значение true на false. Как же добиться, чтобы этого не происходило, a?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38258951
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, ну это все-таки интересно, пока не пойму, успокаиваться не собираюсь Вот один переписанный класс:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class JFMFormattedTextNumberValField extends javax.swing.JFormattedTextField {
	private static final java.text.NumberFormat numberFotrmat = java.text.NumberFormat.getNumberInstance(); 
	
	public JFMFormattedTextNumberValField()
	 {
		 super(numberFotrmat);
		 DefaultFormatter formatter =  (DefaultFormatter) this.getFormatter();
		 formatter.setCommitsOnValidEdit(true);
	 }
   }


При его использовании в GUI, если после ввода кликнуть на другом контроле (неважно каком), то сработает "родной" слушатель stateChanged и выполнится то, что положено. А вот другой класс, наподобие:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public class JFMSpinner extends JSpinner {

        public JFMSpinner() {
            super();
            JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) this.getEditor();
            DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
            formatter.setCommitsOnValidEdit(true);

            public JFMSpinner(SpinnerModel model)
            {
                super(model);
                JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) this.getEditor();
                DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
                formatter.setCommitsOnValidEdit(true);
            }
        }

    }


С ним не получается ничего при переключении на другой контрол (молчу уже о реакции на ввод с клавиатуры). Пробовал другой слушатель:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class JFMSpinner extends JSpinner {

        public JFMSpinner() {
            super();
            JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) this.getEditor();
            DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
            formatter.setCommitsOnValidEdit(true);

            editor.getTextField().addFocusListener(new FocusListener() {
                public void focusLost(FocusEvent fe) {
                    if (fe.getSource() instanceof JSpinner)
                        System.out.println("JSpinner lost, value is " + ((JSpinner) fe.getSource()).getValue());
                }

                public void focusGained(FocusEvent fe) {
                }

            });
        }
    }



С ним та же ситуация - нулевая реакция при потере фокуса. Пожалуйста, подскажите, что здесь неправильно? Понимаю, вопросы дурацкие, но раньше со слушателями Java дела иметь не доводилось, потому столько ошибок.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259001
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, листенеры надо совать сюда
Код: java
1.
((JSpinner.DefaultEditor)ss.getEditor()).getTextField().getDocument().addDocumentListener( ... );
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259002
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну там ещё вот это все
Код: java
1.
JSpinner ss;
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259804
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, DocumentListener тоже ничего не прослушивает Что-то я делаю не так с JSpinner, ведь приводится столько примеров, которые вроде должны работать. Есть еще предложения?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259828
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полуламер,
у мну работает например

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 @Test
    public void spinner() throws InterruptedException {
        JSpinner ss = new JSpinner();
        JTextPane tp = new JTextPane();
        ((JSpinner.DefaultEditor)ss.getEditor()).getTextField().getDocument().addDocumentListener(
                new DocumentListener() {
                    @Override
                    public void insertUpdate(DocumentEvent e) {
                        System.out.println("2");
                    }

                    @Override
                    public void removeUpdate(DocumentEvent e) {
                        System.out.println("3");
                    }

                    @Override
                    public void changedUpdate(DocumentEvent e) {
                       System.out.println("1");
                    }
                }
                                                                                                 );
        JFrame jFrame = new JFrame();
        jFrame.setContentPane(ss);
        jFrame.setVisible(true);
        while (jFrame.isVisible()) Thread.sleep(1000);

    }
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259844
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно нужно ещё попросить спиннер обновить модель:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/**
     * Commits the currently edited value to the <code>SpinnerModel</code>.
     * <p>
     * If the editor is an instance of <code>DefaultEditor</code>, the
     * call if forwarded to the editor, otherwise this does nothing.
     *
     * @throws ParseException if the currently edited value couldn't
     *         be commited.
     */
    public void commitEdit() throws ParseException {
        JComponent editor = getEditor();
        if (editor instanceof DefaultEditor) {
            ((DefaultEditor)editor).commitEdit();
        }
    }
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259897
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманПолуламер,
у мну работает например
Понимаете, Ваш код оформлен как пример самостоятельной программы. У меня давно получилось сделать именно то что нужно, уважаемый Blazkowicz помог еще здесь 14294099 . Думаю, что если просто скопирую Ваш код в отдельный конкретный java-класс, то все тоже получится. Но у меня задача-то ведь - переписать JSpinner так, чтобы он начал понимать либо этот блок:

Код: java
1.
2.
3.
JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) spinner.getEditor();
DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
formatter.setCommitsOnValidEdit(true);



- это вообще идеальный вариант, либо чтобы сработал какой-нибудь listener. Но все варианты классов - со слушателями или без - отказываются работать в теле проекта, ничего из написанного выше не функционирует. То есть создаю с помощью GUI (в моем случае это JFormDesigner) на форме контрол класса JSpinner, заменяю потом этот класс на свой созданный, все компилируется и запускается безо всяких ошибок, но никакой реакции при этом не наблюдается.

Господин Blazkowicz , во имя победы в замке Wolfenstein - отзовитесь, пожалуйста! Возможно, решение совсем близко, очень не хочется заменять удобный компонент тупыми, хотя и модифицированными потомками JTextField.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38259911
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полуламер,

Возьмете ваш код. Удалите лишнее и сделайте запускаемый пример того как приведенное решение не работает. Из сумбурных объяснение выше, мне пока сложно понять в чем дело. А разбираться сейчас, к сожалению, мало времени. Если будет запускаемый пример, могу за пару минут отдебажить.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38260011
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полуламер,

Полуламерзаменяю потом этот класс на свой созданный,

Можете пояснить подробнее эту строку?
Вы уверены, что в итоге в форму попадает именно ваш контрол?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38260244
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман,

да, уверен, иначе реакции на нажатие клавиши не происходит. Но между тем я понял причину, из-за чего не происходит реакция на нажатие клавиши, т.е. stateChanged не срабатывает. Похоже, теперь у меня вопрос уже к знатокам JFormDesigner, или опять ошибаюсь. Итак, новый класс:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class JFMSpinner extends JSpinner {

    public JFMSpinner() {
        super();
        JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) this.getEditor();
        DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
        formatter.setCommitsOnValidEdit(true);
}
}



Я создал новый диалог, на нем разместил JSpinner, поменял класс с JSpinner на JFMSpinner, в обработчике stateChanged прописываю отслеживание изменений значения:

Код: java
1.
2.
3.
    private void spinner2StateChanged(ChangeEvent e) {
        System.out.println("Value: " + spinner2.getValue());
    }


Модель спиннера не меняю, т.е. она остается неприсвоенной. Если посмотреть секцию initComponents, то относительно этого JSpinner там первоначально значится:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
              //---- spinner2 ----
                spinner2.setModel(new SpinnerNumberModel(0, 0, 1000000000, 1));
                spinner2.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        spinner2StateChanged(e);
                    }
                });
                contentPanel.add(spinner2, CC.xy(1, 1));



Если в этом случае запустить тест, то спиннер работает абсолютно корректно - реагирует как на нажатие цифровых клавиш (поскольку является экземпляром нового класса, в котром прописано свойство форматтера setCommitsOnValidEdit(true)), так и на свои стандартные переключатели, в консоли выдаются значения. Но если изменить модель - а это случается в 99,99 % случаев, мало ли, надо выставить границы, шаг, изменить тип модели с Integer на Float. Тогда к инициализации JSpinner в initComponents добавляется строчка типа:

Код: java
1.
spinner2.setModel(new SpinnerNumberModel(0, 0, 1000000000, 1));



Все - если она есть, никакой реакции на ввод с клавиатуры не будет, если произвести грязный трюк и закомментировать ее вручную - спиннер как новенький, значения опять выдаются.
Вот такая непонятная ситуация, как с этим быть - ума не приложу, мне нужны модели именно типа Float, при этом по ходу дела их значения многократно переприсваиваются. Понимаю, что это уже вопрос по обработке JSpinner специализированным дизайнером, но, может, кто-то знает, как побороть эту проблему?
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38260253
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять тороплюсь, но ничего не могу поделать - время поджимает, в первом описании JSpinner (сразу после размещения его на форме) изначально нет строчки с присваиванием модели - забыл ее удалить.
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38261788
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После долгих и мучительных экспериментов выяснил, что любое присваивание модели - с помощью дизайнера или программное, то есть строчка spinner.setmodel(...) начисто губит нужную функцию, реализуемую новым классом. Решил проблему следующим способом - присваивать значения не скопом, а по отдельности, например:

Код: java
1.
2.
3.
4.
                mySpinner.getModel().setValue(5);
                ((SpinnerNumberModel) mySpinner.getModel()).setMinimum(0);
                ((SpinnerNumberModel) mySpinner.getModel()).setMaximum(100);
                ((SpinnerNumberModel) mySpinner.getModel()).setStepSize(1);



После сделанных таким образом изменений значение JSpinner, вводимую вручную, будет фиксироваться в обработчике stateChanged. Теперь вроде все работает как надо. Blazkowicz , спасибо Вам еще раз за помощь
...
Рейтинг: 0 / 0
Слушатель для JSpinner
    #38272314
Полуламер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, я понимаю - конец рабочей недели, всем охота по домам, но не глянете ли на конкретную задачку? Думал, грешным делом все как с JSpinner, ан нет - там свои заморочки. Вобщем, хотелось бы фиксировать изменения при вводе с клавиатуры у компонента - потомка класса JFormattedTextField. Создаю его таким образом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class JFMFormattedTextNumberValField extends JFormattedTextField {
	private static final NumberFormat numberFotrmat = java.text.NumberFormat.getNumberInstance(); 
	
	public JFMFormattedTextNumberValField()
	 {
		 super(numberFotrmat);
		 DefaultFormatter formatter =  (DefaultFormatter) this.getFormatter();
		 formatter.setCommitsOnValidEdit(true);
	 }
}



Создаю на форме компонент, но при вводе чисел не происходит реакции, т.е. полю ничего не присваивается. В чем загвоздка, а?
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Слушатель для JSpinner
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]