Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Слушатель для JSpinner / 23 сообщений из 23, страница 1 из 1
14.05.2013, 13:44:47
    #38256552
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Доброго времени! Возможно, задам сейчас всем надоевший вопрос, но сам не могу найти ответа, уж простите новичка. Проблема такова - хотелось бы заставить 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
14.05.2013, 14:43:39
    #38256693
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Неужели никто не сталкивался с таким? Ни в жизнь не поверю!
...
Рейтинг: 0 / 0
14.05.2013, 14:54:54
    #38256717
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
ПолуламерНеужели никто не сталкивался с таким? Ни в жизнь не поверю!
Spinner редко используется. А там Formatter точно пропускает значение до окончания ввода?
Выложи запускабельный тест, я подебажу.
...
Рейтинг: 0 / 0
14.05.2013, 16:02:45
    #38256829
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Я, собственно, запускал пример по этой ссылке:

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

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

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

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


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

Код: 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
15.05.2013, 18:33:59
    #38259001
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Думаю, листенеры надо совать сюда
Код: java
1.
((JSpinner.DefaultEditor)ss.getEditor()).getTextField().getDocument().addDocumentListener( ... );
...
Рейтинг: 0 / 0
15.05.2013, 18:34:56
    #38259002
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
ну там ещё вот это все
Код: java
1.
JSpinner ss;
...
Рейтинг: 0 / 0
16.05.2013, 11:02:47
    #38259804
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Увы, DocumentListener тоже ничего не прослушивает Что-то я делаю не так с JSpinner, ведь приводится столько примеров, которые вроде должны работать. Есть еще предложения?
...
Рейтинг: 0 / 0
16.05.2013, 11:18:26
    #38259828
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Полуламер,
у мну работает например

Код: 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
16.05.2013, 11:25:49
    #38259844
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Возможно нужно ещё попросить спиннер обновить модель:
Код: 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
16.05.2013, 11:44:54
    #38259897
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
ЛагманПолуламер,
у мну работает например
Понимаете, Ваш код оформлен как пример самостоятельной программы. У меня давно получилось сделать именно то что нужно, уважаемый 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
16.05.2013, 11:48:15
    #38259911
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Полуламер,

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

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

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

да, уверен, иначе реакции на нажатие клавиши не происходит. Но между тем я понял причину, из-за чего не происходит реакция на нажатие клавиши, т.е. 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
16.05.2013, 13:59:39
    #38260253
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Опять тороплюсь, но ничего не могу поделать - время поджимает, в первом описании JSpinner (сразу после размещения его на форме) изначально нет строчки с присваиванием модели - забыл ее удалить.
...
Рейтинг: 0 / 0
17.05.2013, 12:53:19
    #38261788
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
После долгих и мучительных экспериментов выяснил, что любое присваивание модели - с помощью дизайнера или программное, то есть строчка 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
24.05.2013, 15:07:02
    #38272314
Полуламер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слушатель для JSpinner
Господа, я понимаю - конец рабочей недели, всем охота по домам, но не глянете ли на конкретную задачку? Думал, грешным делом все как с 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Слушатель для JSpinner / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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