2015-12-18 4 views
3

Я пытаюсь использовать JDatePicker для отображения календаря. Тем не менее, я хочу показать только месяцы и годы, а не дни.Показывать только месяцы и годы с помощью JDatePicker

Я пробовал ткнуть вокруг модели и объектов JDatePickerImpl, без везения.

Вот код, я должен показать JDatePicker, из документации:

UtilCalendarModel model = new UtilCalendarModel(); 

    Properties p = new Properties(); 
    p.put("text.today", "Today"); 
    p.put("text.month", "Month"); 
    p.put("text.year", "Year"); 

    JDatePanelImpl datePanel = new JDatePanelImpl(model, p); 

    JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateComponentFormatter()); 

Заранее спасибо!

Примечание: Вот изображение того, что я имею в виду.

enter image description here

ответ

3

После просмотра кода из проекта JDatePicker, я думаю, что это возможно, сделав специальную версию JDatePanelImpl класса (и, возможно, некоторые другие классы). Функциональность, которую вы хотите, еще не настраивается в стандартных классах, но она может быть реализована как усовершенствование и отправлена ​​разработчикам JDatePicker в качестве предложения (запрос на pull).

Чтобы убедиться в том, что вам нужно для вашего приложения: вы хотите использовать календарь, подобный приведенному ниже примеру? Пользователь может изменить выбранный месяц & года, нажав на следующую/предыдущую кнопку месяца, выбирая месяц из всплывающего меню месяца, или выбрать другой год (с использованием года кока):

Screenshot of possible month/year picker

Редактировать : добавленный пример с адаптированными версиями классов JDatePicker

Я добавил измененный пример вашего кода и двух адаптированных версий классов JDatePicker. Обычный компонент закрывает всплывающее окно, когда пользователь нажимает определенный день, что невозможно в этом случае (поскольку дни скрыты). Я добавил небольшую кнопку ОК, чтобы закрыть окно выбора даты (см. Скриншот выше). Это, очевидно, только доказательство концепции; код действительно нуждается в дополнительной работе.

(Примечание: когда я попытался добавить два измененных класса, мой ответ стал большим. Поэтому я разветвил проект JDatePicker на GitHub, переписал настройки из JDatePicker версии 1.3.4 до версии 1.3.4.1 и добавил ссылки для этих двух файлов, а не весь код)

// ExampleDatePickerWithoutDay class: 

import java.text.*; 
import javax.swing.*; 
import org.jdatepicker.*; 

public class ExampleDatePickerWithoutDay { 
    public static void main(String[] arguments) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new ExampleDatePickerWithoutDay().createAndShowGui(); 
      } 
     }); 
    } 

    private void createAndShowGui() { 
     JFrame frame = new JFrame("Stack Overflow"); 
     frame.setBounds(100, 100, 800, 200); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 

     // Set two date formats and a text label. 
     DateFormat dateFormat = new SimpleDateFormat("MMMM yyyy"); 
     ComponentFormatDefaults.Key formatKey; 
     formatKey = ComponentFormatDefaults.Key.SELECTED_DATE_FIELD; 
     ComponentFormatDefaults.getInstance().setFormat(formatKey, dateFormat); 
     formatKey = ComponentFormatDefaults.Key.TODAY_SELECTOR; 
     ComponentFormatDefaults.getInstance().setFormat(formatKey, dateFormat); 
     ComponentTextDefaults.Key textKey = ComponentTextDefaults.Key.TODAY; 
     ComponentTextDefaults.getInstance().setText(textKey, "Current month"); 

     // Create the date picker. 
     UtilCalendarModel calendarModel = new UtilCalendarModel(); 
     CustomDatePanel datePanel = new CustomDatePanel(calendarModel); 
     CustomDatePicker datePicker = new CustomDatePicker(datePanel); 

     panel.add(datePicker); 
     frame.getContentPane().add(panel); 
     frame.setVisible(true); 
    } 
} 

CustomDatePanel класса:. CustomDatePanel.java (on GitHub)

CustomDatePicker класса: CustomDatePicker.java (on GitHub)

+0

Спасибо FREEK за ваш ответ! То, что вы показываете, будет работать, хотя я думаю, что было бы лучше, если бы все месяцы года были в одном окне вместо того, чтобы прокручивать стрелки. При этом я не знаю, возможно ли это. –

+0

Этот параметр требует наименьшего количества изменений для существующих классов. Скрывая стол со днями месяца, у вас есть простой базовый месяц и год, который легко может быть конфигурируемой частью кода JDatePicker. Ваша идея, вероятно, предлагает лучшее удобство использования, но требует больше изменений (по моим оценкам). Я могу закончить и добавить свой код, и вы могли бы решить его улучшить или использовать базовую реализацию. –

+0

Если это слишком много проблем, не беспокойтесь. Я думал, что может быть простой способ, но это нормально, если нет :). –

Смежные вопросы