使用 JDatePicker 仅显示月份和年份
Show only months and years with 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());
提前致谢!
注意:这是我的意思的图像。
查看 JDatePicker project, I think this is possible by making a custom version of the JDatePanelImpl
class 中的代码(也许还有一些其他 classes)。您想要的功能在标准 classes 中尚不可配置,但它可以作为增强功能实现并作为提案(拉取请求)发送给 JDatePicker 开发人员。
只是为了确定您的应用程序需要什么:您想使用类似于以下示例的日历吗?用户可以通过单击 next/previous 月份按钮、从月份弹出菜单中选择月份或选择不同的年份(使用年份微调器)来更改所选的月份和年份:
编辑:添加了 JDatePicker 改编版本的示例 classes
我添加了您的代码的修改示例和 JDatePicker 的两个改编版本 classes。当用户单击特定日期时,普通组件会关闭弹出窗口,这在这种情况下是不可能的(因为日期是隐藏的)。我添加了一个小的 OK 按钮,可以关闭日期选择器(请参见上面的屏幕截图)。这显然只是一个概念证明;代码确实需要更多工作。
(注意:当我尝试添加两个修改后的 classes 时,我的答案变得很大。因此我在 GitHub 上分叉了 JDatePicker 项目,重写了 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);
}
}
自定义日期面板 class: CustomDatePanel.java (on GitHub)
自定义日期选择器class:CustomDatePicker.java (on GitHub)
我正在尝试使用 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());
提前致谢!
注意:这是我的意思的图像。
查看 JDatePicker project, I think this is possible by making a custom version of the JDatePanelImpl
class 中的代码(也许还有一些其他 classes)。您想要的功能在标准 classes 中尚不可配置,但它可以作为增强功能实现并作为提案(拉取请求)发送给 JDatePicker 开发人员。
只是为了确定您的应用程序需要什么:您想使用类似于以下示例的日历吗?用户可以通过单击 next/previous 月份按钮、从月份弹出菜单中选择月份或选择不同的年份(使用年份微调器)来更改所选的月份和年份:
编辑:添加了 JDatePicker 改编版本的示例 classes
我添加了您的代码的修改示例和 JDatePicker 的两个改编版本 classes。当用户单击特定日期时,普通组件会关闭弹出窗口,这在这种情况下是不可能的(因为日期是隐藏的)。我添加了一个小的 OK 按钮,可以关闭日期选择器(请参见上面的屏幕截图)。这显然只是一个概念证明;代码确实需要更多工作。
(注意:当我尝试添加两个修改后的 classes 时,我的答案变得很大。因此我在 GitHub 上分叉了 JDatePicker 项目,重写了 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);
}
}
自定义日期面板 class: CustomDatePanel.java (on GitHub)
自定义日期选择器class:CustomDatePicker.java (on GitHub)