📄 datepanel.java
字号:
/* * NachoCalendar * * Project Info: http://nachocalendar.sf.net * * 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., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * Changes * ------- * * 2005-06-18 Fixed ChangeListener problem * 2005-01-08 Cleanups * 2005-01-02 Fixed startup bug * Added property change support * 2004-12-24 Reimplemented selection model, now supports multiple selection * Added keyboard navigation * 2004-12-21 Added antialiasing support * 2004-12-11 setFirsDayOfWeek now works correctly * 2004-10-22 setEnabled(boolean b) overriden, now works * 2004-10-18 Added mousewheellistener * 2004-10-13 Added workingDays * 2004-10-01 Checked with checkstyle * * ------- * * DatePanel.java * * Created on August 13, 2004, 8:11 PM */package net.sf.nachocalendar.components;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseWheelEvent;import java.awt.event.MouseWheelListener;import java.text.ParseException;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import javax.swing.JButton;import javax.swing.JPanel;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;import net.sf.nachocalendar.event.DateSelectionEvent;import net.sf.nachocalendar.event.DateSelectionListener;import net.sf.nachocalendar.event.MonthChangeEvent;import net.sf.nachocalendar.event.YearChangeEvent;import net.sf.nachocalendar.event.YearChangeListener;import net.sf.nachocalendar.model.DataModel;import net.sf.nachocalendar.model.DateSelectionModel;import net.sf.nachocalendar.model.DefaultDateSelectionModel;/** * Panel for selecting a day. It has custom components to change the displaying * month and year * * @author Ignacio Merani */public class DatePanel extends JPanel { private MonthPanel monthpanel; private Calendar calendar, navigation; private MonthScroller monthscroller; private YearScroller yearscroller; private boolean antiAliased; private DateSelectionModel dateSelectionModel; private MouseListener mlistener; private KeyListener klistener; private boolean printMoon; private JButton today; /** * Utility field holding list of ChangeListeners. */ private transient java.util.ArrayList changeListenerList; /** * Holds value of property workingDays. */ private boolean[] workingDays; /** * Utility field holding list of ActionListeners. */ private transient java.util.ArrayList actionListenerList; /** * Default constructor. It creates a DatePanel with default values */ public DatePanel() { monthpanel = new MonthPanel(); init(); } /** * Creates a DatePanel and let specify the showing of week numbers. * * @param showWeekNumbers * true for showing week numbers */ public DatePanel(boolean showWeekNumbers) { monthpanel = new MonthPanel(showWeekNumbers); init(); } private void init() { setRenderer(new DefaultDayRenderer()); setHeaderRenderer(new DefaultHeaderRenderer()); workingDays = new boolean[7]; dateSelectionModel = new DefaultDateSelectionModel(); monthscroller = new MonthScroller(); yearscroller = new YearScroller(); calendar = new GregorianCalendar(); navigation = new GregorianCalendar(); add(monthpanel); setDate(calendar.getTime()); setFocusable(true); today = new JButton(CalendarUtils.getMessage("today")); today.setVisible(false); JPanel arriba = new JPanel(new GridLayout(1, 2)); setLayout(new BorderLayout()); arriba.add(monthscroller); arriba.add(yearscroller); add(arriba, BorderLayout.NORTH); add(monthpanel, BorderLayout.CENTER); add(today, BorderLayout.SOUTH); addListeners(); DayPanel[] daypanels = monthpanel.getDaypanels(); for (int i = 0; i < daypanels.length; i++) { daypanels[i].addMouseListener(mlistener); daypanels[i].addKeyListener(klistener); } monthpanel.setMonth(getDate()); } private void addListeners() { monthscroller.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { updateMonth(); } }); yearscroller.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { updateYear(); } }); monthscroller.addYearChangeListener(new YearChangeListener() { public void yearIncreased(YearChangeEvent e) { yearscroller.setYear(yearscroller.getYear() + 1); updateYear(); } public void yearDecreased(YearChangeEvent e) { yearscroller.setYear(yearscroller.getYear() - 1); updateYear(); } }); addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { if (!isEnabled()) return; int q = e.getWheelRotation(); for (int i = 0; i < Math.abs(q); i++) { if (q > 0) { monthscroller.nextMonth(); } else monthscroller.previousMonth(); } } }); dateSelectionModel.addDateSelectionListener(new DateSelectionListener() { public void valueChanged(DateSelectionEvent e) { refreshSelection(); fireChangeListenerStateChanged(new ChangeEvent(DatePanel.this)); } }); mlistener = new MouseAdapter() { public void mouseClicked(MouseEvent e) { DayPanel dp = (DayPanel) e.getSource(); if (!dp.isEnabled() || !dp.isComponentEnabled()) return; dateSelectionModel.setValueIsAdjusting(true); if (!e.isControlDown()) { dateSelectionModel.clearSelection(); if (e.isShiftDown()) { dateSelectionModel.addSelectionInterval( dateSelectionModel.getLeadSelectionDate(), dp .getDate()); } else dateSelectionModel.addSelectionInterval(dp.getDate(), dp.getDate()); } else { if (e.isShiftDown()) { dateSelectionModel.addSelectionInterval( dateSelectionModel.getLeadSelectionDate(), dp .getDate()); } else { if (dateSelectionModel.isSelectedDate(dp.getDate())) { dateSelectionModel.removeSelectionInterval(dp .getDate(), dp.getDate()); } else dateSelectionModel.addSelectionInterval(dp .getDate(), dp.getDate()); } } dateSelectionModel.setLeadSelectionDate(dp.getDate()); repaint(); dp.requestFocus(); calendar.setTime(dp.getDate()); dateSelectionModel.setValueIsAdjusting(false); fireActionListenerActionPerformed(new ActionEvent(this, 0, "clicked")); } }; klistener = new KeyListener() { public void keyPressed(KeyEvent e) { boolean changed = false; int keycode = e.getKeyCode(); navigation.setTime(calendar.getTime()); if ((keycode == KeyEvent.VK_LEFT) || (keycode == 226)) { int month = navigation.get(Calendar.MONTH); navigation.add(Calendar.DAY_OF_YEAR, -1); if (month != navigation.get(Calendar.MONTH)) { fireMonthChangeListenerMonthDecreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); } changed = true; } if ((keycode == KeyEvent.VK_RIGHT) || (keycode == 227)) { int month = navigation.get(Calendar.MONTH); navigation.add(Calendar.DAY_OF_YEAR, 1); if (month != navigation.get(Calendar.MONTH)) { fireMonthChangeListenerMonthIncreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); } changed = true; } if ((keycode == KeyEvent.VK_UP) || (keycode == 224)) { int month = navigation.get(Calendar.MONTH); navigation.add(Calendar.DAY_OF_YEAR, -7); if (month != navigation.get(Calendar.MONTH)) { fireMonthChangeListenerMonthDecreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); } changed = true; } if ((keycode == KeyEvent.VK_DOWN) || (keycode == 225)) { int month = navigation.get(Calendar.MONTH); navigation.add(Calendar.DAY_OF_YEAR, 7); if (month != navigation.get(Calendar.MONTH)) { fireMonthChangeListenerMonthIncreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); } changed = true; } if ((keycode == KeyEvent.VK_PAGE_UP)) { navigation.add(Calendar.MONTH, -1); fireMonthChangeListenerMonthIncreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); changed = true; } if ((keycode == KeyEvent.VK_PAGE_DOWN)) { navigation.add(Calendar.MONTH, 1); fireMonthChangeListenerMonthIncreased(new MonthChangeEvent( this, navigation.getTime())); setDate(navigation.getTime()); changed = true; } if (changed) { if ((!e.isControlDown()) && (!e.isShiftDown())) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -