首页 > 解决方案 > 如何使用 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);
}

标签: javaswingjcomboboxlocaldate

解决方案


正如@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));
    }

}

推荐阅读