После просмотра кода из проекта JDatePicker, я думаю, что это возможно, сделав специальную версию JDatePanelImpl
класса (и, возможно, некоторые другие классы). Функциональность, которую вы хотите, еще не настраивается в стандартных классах, но она может быть реализована как усовершенствование и отправлена разработчикам JDatePicker в качестве предложения (запрос на pull).
Чтобы убедиться в том, что вам нужно для вашего приложения: вы хотите использовать календарь, подобный приведенному ниже примеру? Пользователь может изменить выбранный месяц & года, нажав на следующую/предыдущую кнопку месяца, выбирая месяц из всплывающего меню месяца, или выбрать другой год (с использованием года кока):
Редактировать : добавленный пример с адаптированными версиями классов 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)
Спасибо FREEK за ваш ответ! То, что вы показываете, будет работать, хотя я думаю, что было бы лучше, если бы все месяцы года были в одном окне вместо того, чтобы прокручивать стрелки. При этом я не знаю, возможно ли это. –
Этот параметр требует наименьшего количества изменений для существующих классов. Скрывая стол со днями месяца, у вас есть простой базовый месяц и год, который легко может быть конфигурируемой частью кода JDatePicker. Ваша идея, вероятно, предлагает лучшее удобство использования, но требует больше изменений (по моим оценкам). Я могу закончить и добавить свой код, и вы могли бы решить его улучшить или использовать базовую реализацию. –
Если это слишком много проблем, не беспокойтесь. Я думал, что может быть простой способ, но это нормально, если нет :). –