1

我需要在 JCalendar 应用程序中更改选定日期的颜色。问题是:我看了一下JCalendar的源代码,并没有看到任何改变颜色的方法。

让我看看我是否可以在这里更清楚......

JCalendar 有特殊日期,
JXMonthView 有标记日期,
但它们都没有办法改变特定日期的颜色。

如果我想选择它们的颜色,我必须这样做:

jxMonthView = new JXMonthView(new Locale("pt_BR")) {

        private static final long serialVersionUID = 1L;

        Color currentColor = null;

        @Override
        public boolean isFlaggedDate(Date date) {
            if (!dataLoaded)
                return super.isFlaggedDate(date);
            try {
                StackTraceElement[] stackTrace = new Throwable()
                        .getStackTrace();
                if (stackTrace[1].getClassName().contains(
                        "CalendarCellContext")) {
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(date);
                    DiaUtil diaUtil = listener.getDiaUtil(cal);
                    if (diaUtil != null) {
                        if (diaUtil.getValor() == 0) {
                            currentColor = Color.RED;
                        } else if (diaUtil.getValor() < 1) {
                            currentColor = Color.YELLOW;
                        }
                    } else {

                    }
                }
            } catch (Exception e) {
            }
            return super.isFlaggedDate(date);

        }

        @Override
        public Color getFlaggedDayForeground() {
            if (currentColor == null) {
                return super.getFlaggedDayForeground();
            }
            return currentColor;
        }
    };

关于如何改变颜色的任何想法?或者另一种方式而不是使用 JCalendar?

4

1 回答 1

1

这是java提供的日历demo

/* 
* $Id: DemoCalendarRenderingHandler.java 1170 2009-11-04 14:01:25Z kleopatra $ 
* 
* Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle, 
* Santa Clara, California 95054, U.S.A. All rights reserved. 
* 
* This library is free software; you can redistribute it and/or 
* modify it under the terms of the GNU Lesser General Public 
* License as published by the Free Software Foundation; either 
* version 2.1 of the License, or (at your option) any later version. 
*  
* This library is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
* Lesser General Public License for more details. 
*  
* You should have received a copy of the GNU Lesser General Public 
* License along with this library; if not, write to the Free Software 
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
* 
*/ 

 package org.jdesktop.swingx.plaf.basic; 

 import java.util.Calendar; 

 import javax.swing.JComponent; 

 import org.jdesktop.swingx.JXMonthView; 
 import org.jdesktop.swingx.decorator.CompoundHighlighter; 
 import org.jdesktop.swingx.decorator.Highlighter; 

/** 
* An example of a custom CalendarRenderingHandler. As of laziness (mine :-) this 
* extends the BasicXX to widen access and provide hooks to add Highlighters. 
*  
* @author Jeanette Winzenburg 
*/ 

 public class DemoCalendarRenderingHandler extends BasicCalendarRenderingHandler { 

 private DemoCalendarAdapter adapter; 
 private CompoundHighlighter demoHighlighter; 

 /** 
  * Sets the <code>Highlighter</code>s to the table, replacing any old settings. 
  * None of the given Highlighters must be null.<p> 
  *  
  * @param highlighters zero or more not null highlighters to use for renderer decoration. 
  * @throws NullPointerException if array is null or array contains null values. 
  */ 
 // <snip> Custom CalendarRenderingHandler 
 // Minimal api to allow adding Highlighters.  

 public void setHighlighters(Highlighter... highlighters) { 
     getHighlighter().setHighlighters(highlighters); 
 } 
 // </snip> 

 /** 
  * Appends the <code>Highlighter</code>s to the end of the list of used 
  * <code>Highlighter</code>s. None of the given Highlighters must be null. 
  * <p> 
  *  
  * @param highlighters zero or more not null highlighters to use for renderer decoration. 
  * @throws NullPointerException if array is null or array contains null values. 
  */ 
 // <snip> Custom CalendarRenderingHandler 
 // Minimal api to allow adding Highlighters.  

  public void addHighlighters(Highlighter... highlighters) { 
     for (Highlighter highlighter : highlighters) { 
         getHighlighter().addHighlighter(highlighter); 
     } 
 } 
 // </snip> 

 /** 
  * Overridden to apply the additional highlighters, if any. 
  */ 
 @Override 
 public JComponent prepareRenderingComponent(JXMonthView monthView, 
         Calendar calendar, CalendarState dayState) { 
     JComponent component = super.prepareRenderingComponent(monthView, calendar, dayState); 
      return (JComponent) getHighlighter().highlight( 
              component, getCalendarAdapter(monthView, calendar, dayState)); 
 } 

 /** 
  * Returns a CompoundHighlighter containing the additional highlighters, if  
  * any. 
  *  
  * @return a CompoundHighlighter containing the additional higlighters,  
  *    guaranteed to never be null, but might be empty. 
  */ 

 protected CompoundHighlighter getHighlighter() { 
     if (demoHighlighter == null) { 
         demoHighlighter = new CompoundHighlighter(); 
     } 
     return demoHighlighter; 
 } 

 /** 
  * Returns a CalendarAdapter installed with the given monthView and  
  * state. 
  *  
  * @param monthView 
  * @param calendar 
  * @param dayState 
  * @return 
  */ 

  protected DemoCalendarAdapter getCalendarAdapter(JXMonthView monthView, 
         Calendar calendar, CalendarState dayState) { 
     if (adapter == null) { 
         adapter = new DemoCalendarAdapter(monthView); 
     } 
     return adapter.install(calendar, dayState); 
  } 

 /** 
  * CalendarAdapter, subclassed for public access and fix of selected 
  * day state. 
  *   
  */ 

  public static class DemoCalendarAdapter extends CalendarAdapter { 

     /** 
      * Instantiates a ComponentAdapter with the given monthView. 
      *  
      * @param component 
      */ 

     public DemoCalendarAdapter(JXMonthView component) { 
         super(component); 
     } 

     /** 
      * {@inheritDoc} <p> 
      *  
      * Overridden to return a publicly accessible class. 
      */ 

     @Override 
     public DemoCalendarAdapter install(Calendar calendar, CalendarState dayState) { 
         return (DemoCalendarAdapter) super.install(calendar, dayState); 
     } 

     /** 
      * {@inheritDoc} <p> 
      *  
      * Overridden to report selected only if a day of the month.  
      */ 

     @Override 
     public boolean isSelected() { 
         // PENDING JW: this should be handled in super 
         if (!isDayInMonth()) return false; 
         return super.isSelected(); 
     } 

     /** 
      * Returns a clone of the current calendar. 
      * @return 
      */ 
     public Calendar getCalendar() { 
         // PENDING JW: this should be handled in super 
         return (Calendar) calendar.clone(); 
     } 

     /** 
      * @param dayState 
      * @return 
      */ 
     public boolean isDayInMonth() { 
         return (CalendarState.IN_MONTH == getCalendarState())  
             || (CalendarState.TODAY == getCalendarState()); 
     } 

 } 
于 2013-01-30T18:21:20.863 回答