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

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

我的ui的屏幕截图

inheritance我的代码:

 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date sdate= null; String d = null; for(int i =0;i<pd.size();i++){ d = pd.get(i).getDate(); try{ sdate = (Date)formatter.parse(d); if(events.contains(sdate)){ } else{ events.add(sdate); System.out.println(sdate); } }catch(ParseException r){ System.out.println("error"); } } //arraylist of events for(int i = 0; i < events.size(); i++) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(events.get(i)); int day1 = cal1.get(Calendar.DAY_OF_MONTH); int month1 = cal1.get(Calendar.MONTH); int year1 = cal1.get(Calendar.YEAR); //selected month and year on JCalendar if(month == month1 && year == year1) { // Calculate the offset of the first day of the month cal.set(Calendar.DAY_OF_MONTH,1); int offset = cal.get(Calendar.DAY_OF_WEEK) -1; component[day1 + offset ].setBackground(Color.blue); } } 

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

图片

 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 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); } }