java - 如何使用 JComboBox 制作日历?
问题描述
我想让它自适应,就像 2000 年 2 月有 29 天,但到 2001 年它会变成 28 天。
我想在使用时这样做JComboBox
如何使用组合框制作动作日历?
JComboBox jcb,jcb1,jcb2;
db(){
JFrame jf = new JFrame("register");
jf.setLayout=(new FlowLayout());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy");
String aa1="0"+1+"-"+"0"+2+"-"+2000;
date = LocalDate.parse(aa1,dtf);
Integer day[] = new Integer[date.lengthOfMonth()];
for(int i=0;i<date.lengthOfMonth();i++) {
day[i]=i+1;
}
jcb = new JComboBox<>(day);
Integer month[] = new Integer[12];
for(int i=0;i<12;i++) {
month[i]=i+1;
}
jcb1 = new JComboBox<>(month);
Integer year[] = new Integer[80];
for(int i=0;i<80;i++) {
year[i]=i+1940;
}
jcb2 = new JComboBox<>(year);
jf.add(jcb);
jf.add(jcb1);
jf.add(jcb2);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setBounds(300,300,300,300);
jf.setVisible(true);
}
解决方案
正如@Andrew Thompson 在评论中提到的那样,用于日期选择的 JComboBoxes 不是一个好主意。看看哪个是最好的 Java 日期选择器。
但是,如果您仍然坚持使用组合框,为了达到您想要的效果,您将不得不添加ActionListener
一个月/年组合框以重新修复天组合框的模型(项目)。
看看这个例子:
public class Test extends JFrame implements ActionListener {
private JComboBox<Integer> yearBox;
private JComboBox<Integer> monthBox;
private JComboBox<Integer> dayBox;
public Test() {
super("test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new FlowLayout());
yearBox = new JComboBox<>();
for (int i = 1940; i <= LocalDateTime.now().getYear(); i++) {
yearBox.addItem(i);
}
yearBox.addActionListener(this);
monthBox = new JComboBox<>();
for (int i = 1; i <= 12; i++) {
monthBox.addItem(i);
}
monthBox.addActionListener(this);
dayBox = new JComboBox<>();
add(new JLabel("year:"));
add(yearBox);
add(new JLabel("month:"));
add(monthBox);
add(new JLabel("day:"));
add(dayBox);
//Start with current year selected
yearBox.setSelectedIndex(yearBox.getItemCount() - 1);
setSize(400, 400);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
int year = (int) yearBox.getSelectedItem();
int month = (int) monthBox.getSelectedItem();
int daysInThisMonth = LocalDate.of(year, month, 1).lengthOfMonth();
int previousSelection = dayBox.getSelectedItem() != null ? (int) dayBox.getSelectedItem() : 1;
dayBox.removeAllItems();
for (int i = 1; i <= daysInThisMonth; i++) {
dayBox.addItem(i);
}
if (previousSelection >= dayBox.getItemCount())
//select last index of month
dayBox.setSelectedIndex(dayBox.getItemCount() - 1);
else
dayBox.setSelectedItem(previousSelection);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Test().setVisible(true));
}
}
推荐阅读
- discord.js - 使用 Discord.JS 获取禁令
- java - SharedPreferences 在杀死应用程序或重新启动设备后从 xml 中删除
- arrays - 快速在数组中设置类属性
- php - 编辑 php.ini 文件后发生 XAMPP 未知错误
- xaml - 如何在代码隐藏中设置 ListView 的 `ScrollViewer.HorizontalScrollMode`?
- azure - 有没有办法等待“az webapp restart”完成?
- c++ - Windows 10 是否无法通过管道输出和重定向输入?(第二次编辑)
- python - 我的 tensorflow 语义分割 unet 模型输出 0 准确度
- ios - 如何检查 Chromecast 是否正在播放媒体或在 Swift iOS 应用程序中暂停?
- angular - Ionic 3 需要一个同伴