Как я могу сделать календарь, используя JComboBox? - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу сделать его адаптивным, как если бы февраль получил 29 дней в 2000 году, но в 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);
}

1 Ответ

1 голос
/ 28 сентября 2019

Как отметил @Andrew Thompson в комментариях, JComboBoxes для выбора даты не очень хорошая идея.Взгляните на Какой из них является лучшим в Java DatePicker.

Однако, если вы все еще настаиваете на использовании комбинированных списков, для достижения того, что вы хотите, вам придется добавить 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));
    }

}
...