2016-06-17 62 views
2

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

Sccreenshot of my ui

而且我的继承人代码:

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

回答

2

作为替代更换的部件,实现IDateEvaluator并返回所需的颜色,建议here。目前尚不清楚您的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); 
    } 
} 
相关问题