Как я могу сделать так, чтобы объект JSpinner выделял все свое содержимое, чтобы пользовательский ввод не требовал удаления при получении фокуса?

Не так много, чтобы добавить к вопросу заголовка.

Вот как выглядит переход к первому полю с курсором перед первым символом в поле, так что пользователю придется удалить символ, если он хочет ввести свой собственный номер месяца, дня или года:

введите здесь описание изображения

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

введите здесь описание изображения

Я могу сделать это для JTextField вот так, например:

txtDateFrom.select(0,99);

Но .select() не подходит для JSpinner.

(Я понимаю, что это поднимает вопрос: «Зачем использовать счетчик?», но очевидный ответ заключается в том, что я хотел бы, чтобы были доступны оба метода выбора, как это принято в дизайне.)

(Гораздо менее насущный, но связанный вопрос... Я создал целочисленный массив из 100 годовых дат [например, 2014] с именем years и использовал SpinnerListModel(years), потому что при использовании SpinnerNumberModel год будет отображаться как 2014. Я могу жить с тем, что Я сделал, но есть ли способ с меньшей грубой силой? Для этого метода нет метода, содержащего «формат».)


person DSlomer64    schedule 20.01.2014    source источник
comment
Если я использую JTextField, который был инициализирован, например, 01/18/2014, Java сделал его очень удобным для пользователя, так как двойной щелчок по части mm, dd или yyyy поля mm/dd/yyyy выделяет эту часть, чтобы пользователь запись перезаписывает выбор без необходимости удаления — например, 01/18/2014. Я могу вернуться к этому, если нет относительно простого решения моей проблемы, как указано выше.   -  person DSlomer64    schedule 20.01.2014
comment
@HovercraftFullOfEels — вы правы в том, что это дубликат. Предложения по ссылке рискованны, и им трудно следовать, поэтому мне придется изучить их более внимательно. Кажется, через многое нужно пройти для такой общей потребности. Я могу согласиться на примечание VGR с двумя строками, так как мой метод с тремя счетчиками выглядит детским и его легко реализовать как есть.   -  person DSlomer64    schedule 20.01.2014
comment
DSlomer: Рекомендации VGR ничем не отличаются от рекомендаций Роба Камика (camickr) в ссылке, которую я предоставляю, и ответ Роба содержит больше информации, чем ответ VGR. Я мог бы написать то же самое вчера, но понял, зачем повторять то, что уже есть? Проблема с обеими рекомендациями заключается в том, что, хотя они, кажется, работают для платформы Windows, они не работают для большинства компьютеров Mac, поэтому MadProgrammer добавил дополнительную задержку. Swing Timer также может обеспечить аналогичную задержку, если это необходимо.   -  person Hovercraft Full Of Eels    schedule 21.01.2014
comment
Прошу прощения, если разместил то, что уже было по этой ссылке. Я прочитал его и увидел предложения по использованию одного вызова invokeLater, и я видел предложения по использованию эвристической задержки, но на самом деле я не видел никаких предложений, которые использовали бы два вызова invokeLater (один внутри другого). Мне было бы интересно узнать, работает ли подход double-invokeLater в OS X.   -  person VGR    schedule 21.01.2014
comment
@ Hover - мне понравилось только «двухстрочное примечание» VGR, потому что его было легко реализовать, чтобы делать именно то, что мне нужно было в данный момент для Windows, то есть недальновидно, непрофессионально, но я просто бездельничаю. , полусерьезно. Я проголосовал за вас день или два назад и всегда ценю вашу ясность в ответе. Просто у меня нет опыта, чтобы оценить записи Роба. Как я уже сказал, мне нужно (в конце концов) вернуться и изучить их. Но вы только что заставили в конце концов показаться раньше. В любом случае, спасибо.   -  person DSlomer64    schedule 22.01.2014


Ответы (1)


Это работает в Java 1.7.0_51, в Windows и Linux. У меня нет возможности проверить это в OS X.

JSpinner.DefaultEditor editor =
    (JSpinner.DefaultEditor) spinner.getEditor();

editor.getTextField().addFocusListener(new FocusAdapter() {
    @Override
    public void focusGained(FocusEvent event) {
        final JTextField textField = (JTextField) event.getComponent();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        textField.selectAll();
                    }
                });
            }
        });
    }
});

Примечание: вы рассматривали возможность замены трех JSpinner одним JSpinner?

JSpinner spinner = new JSpinner(new SpinnerDateModel());
spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/dd/yyyy"));

Кнопки со стрелками вверх/вниз (и клавиши со стрелками) изменят любое поле, содержащее текстовый курсор.

Это не решит вашу проблему с фокусом, но вы можете решить, что проблема не так важна.

person VGR    schedule 20.01.2014
comment
@VGR - я новичок в редакторах, поэтому мне придется немного поискать и прочитать, но я планирую попробовать ваше двухстрочное примечание. Спасибо. - person DSlomer64; 20.01.2014
comment
Это не заняло много времени - мне это нравится больше, чем мои 3 блесны FAR! Так что двойное спасибо. Мне еще нужно прочитать про .setEditor и т.д. Я нашел это вчера вечером в тексте, но пример не состоял из двух строк, поэтому я его отложил. Ваши две строчки - находка. - person DSlomer64; 20.01.2014
comment
P.S. Я был разочарован, получив исключение нулевого указателя, но с облегчением от того, что его так легко исправить: spinner.setValue(new Date());... Это поставило сегодняшнюю дату в качестве значения счетчика по умолчанию: 20/01/2014#, где '#' - это объекты счетчика вверх-вниз. . - person DSlomer64; 20.01.2014
comment
Представьте мое удивление, когда мне потребовалось слишком много времени, чтобы понять, что в строке формата ММ/дд/гггг CASE MATTERS! Короче говоря, мм представляет минуты. Если не считать того глупого движения, которое я сделал, мне нравится твое примечание, так как оно стало МОИМ ГЛАВНЫМ примечанием! Так чисто! БОЛЬШОЕ БОЛЬШОЕ СПАСИБО! - person DSlomer64; 21.01.2014