Java突出显示JCalendar单元格中的特定日期

时间:2016-06-17 15:23:42

标签: java jcalendar

我按照代码here设置了Toedter' s y.extend(z) 中特定日期的颜色。我现在面临的问题是它没有突出显示正确的单元格。在我的例子中,我使用了6月14日和15日,但它突出显示了第8和第9。

Sccreenshot of my ui

继承我的代码:

Calendar

1 个答案:

答案 0 :(得分:2)

作为更改组件的替代方法,请按照建议here实施IDateEvaluator并返回所需的颜色。目前尚不清楚Calendar偏移在哪里出错。以下示例使用List::contains来标识特殊日期。请务必清除add()日历日期的时间字段。

image

import com.toedter.calendar.IDateEvaluator;
import com.toedter.calendar.JCalendar;
import java.awt.Color;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JFrame;

/**
 * @see https://stackoverflow.com/a/37899883/230513
 * @see https://stackoverflow.com/q/25501373/230513
 */
public class HighlightTest {

    private static class HighlightEvaluator implements IDateEvaluator {

        private final List<Date> list = new ArrayList<>();

        public void add(Date date) {
            list.add(date);
        }

        @Override
        public boolean isSpecial(Date date) {
            return list.contains(date);
        }

        @Override
        public Color getSpecialForegroundColor() {
            return Color.red.darker();
        }

        @Override
        public Color getSpecialBackroundColor() {
            return Color.blue;
        }

        @Override
        public String getSpecialTooltip() {
            return "Highlighted event.";
        }

        @Override
        public boolean isInvalid(Date date) {
            return false;
        }

        @Override
        public Color getInvalidForegroundColor() {
            return null;
        }

        @Override
        public Color getInvalidBackroundColor() {
            return null;
        }

        @Override
        public String getInvalidTooltip() {
            return null;
        }
    }

    private void display() {
        JFrame f = new JFrame("Highlight Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        HighlightEvaluator evaluator = new HighlightEvaluator();
        evaluator.add(createDate(14));
        evaluator.add(createDate(15));
        JCalendar jc = new JCalendar();
        jc.getDayChooser().addDateEvaluator(evaluator);
        jc.setCalendar(jc.getCalendar());
        f.add(jc);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private Date createDate(int d) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DAY_OF_MONTH, d);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return (c.getTime());
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new HighlightTest()::display);
    }
}