eu.schudt.javafx.controls.calendar.CalendarView Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tiwulfx Show documentation
Show all versions of tiwulfx Show documentation
TiwulFX provides JavaFX custom components specially designed to work with java POJO object.
package eu.schudt.javafx.controls.calendar;
import com.panemu.tiwulfx.control.DateFieldController;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
/**
* A calendar control
*
* @author Christian Schudt
*/
public class CalendarView extends VBox {
private static final String CSS_CALENDAR_FOOTER = "calendar-footer";
private static final String CSS_CALENDAR = "calendar";
private static final String CSS_CALENDAR_TODAY_BUTTON = "calendar-today-button";
/**
* Initializes a calendar with the default locale.
*/
public CalendarView() {
this(Locale.getDefault());
}
/**
* Initializes a calendar with the given locale.
* E.g. if the locale is en-US, the calendar starts the days on Sunday.
* If it is de-DE the calendar starts the days on Monday.
*
* Note that the Java implementation only knows {@link java.util.GregorianCalendar} and {@link sun.util.BuddhistCalendar}.
*
* @param locale The locale.
*/
public CalendarView(final Locale locale) {
this(locale, Calendar.getInstance(locale));
// When the locale changes, also change the calendar.
this.locale.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
calendar.set(Calendar.getInstance(localeProperty().get()));
}
});
}
/**
* Initializes the control with the given locale and the given calendar.
*
* This way, you can pass a custom calendar (e.g. you could implement the Hijri Calendar for the arabic world).
* Or you can use an American style calendar (starting with Sunday as first day of the week)
* together with another language.
*
* The locale determines the date format.
*
* @param locale The locale.
* @param calendar The calendar
*/
public CalendarView(final Locale locale, final Calendar calendar) {
this.locale.set(locale);
this.calendar.set(calendar);
getStyleClass().add(CSS_CALENDAR);
setMaxWidth(Control.USE_PREF_SIZE);
currentlyViewing.set(Calendar.MONTH);
calendarDate.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
getCalendar().setTime(calendarDate.get());
}
});
this.calendarDate.set(new Date());
currentDate.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
Date date = new Date();
if (currentDate.get() != null) {
date = currentDate.get();
}
calendarDate.set(date);
}
});
MainStackPane mainStackPane = new MainStackPane(this);
VBox.setVgrow(mainStackPane, Priority.ALWAYS);
mainNavigationPane = new MainNavigationPane(this);
todayButtonBox = new HBox();
todayButtonBox.getStyleClass().add(CSS_CALENDAR_FOOTER);
final Button todayButton = new Button();
todayButton.textProperty().bind(todayButtonText);
todayButton.getStyleClass().add(CSS_CALENDAR_TODAY_BUTTON);
todayButton.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent actionEvent) {
Calendar calendar = calendarProperty().get();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
selectedDate.set(calendar.getTime());
}
});
todayButtonBox.setAlignment(Pos.CENTER);
todayButtonBox.getChildren().add(todayButton);
getChildren().addAll(mainNavigationPane, mainStackPane);
showTodayButton.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
if (showTodayButton.get()) {
getChildren().add(todayButtonBox);
} else {
getChildren().remove(todayButtonBox);
}
}
});
controllerProperty.addListener(new ChangeListener() {
@Override
public void changed(ObservableValue extends DateFieldController> ov, DateFieldController t, DateFieldController t1) {
if (t1 != null) {
boolean enable = t1.isEnabled(new Date());
todayButton.setDisable(!enable);
}
}
});
}
private HBox todayButtonBox;
/**
* Gets or sets the locale.
*
* @return The property.
*/
public ObjectProperty localeProperty() {
return locale;
}
private ObjectProperty locale = new SimpleObjectProperty();
public Locale getLocale() {
return locale.get();
}
public void setLocale(Locale locale) {
this.locale.set(locale);
}
/**
* Gets or sets the calendar.
*
* @return The property.
*/
public ObjectProperty calendarProperty() {
return calendar;
}
private ObjectProperty calendar = new SimpleObjectProperty();
public Calendar getCalendar() {
return calendar.get();
}
public void setCalendar(Calendar calendar) {
this.calendar.set(calendar);
}
/**
* Gets the list of disabled week days.
* E.g. if you add Calendar.WEDNESDAY
, Wednesday will be disabled.
*
* @return The list.
*/
public ObservableList getDisabledWeekdays() {
return disabledWeekdays;
}
private ObservableList disabledWeekdays = FXCollections.observableArrayList();
private ObjectProperty controllerProperty = new SimpleObjectProperty<>();
public ObjectProperty controllerProperty() {
return controllerProperty;
}
public DateFieldController getController() {
return controllerProperty.get();
}
public void setController(DateFieldController dateFieldController) {
this.controllerProperty.set(dateFieldController);
}
/**
* Gets the selected date.
*
* @return The property.
*/
public ReadOnlyObjectProperty selectedDateProperty() {
return selectedDate;
}
private ObjectProperty currentDate = new SimpleObjectProperty();
public ObjectProperty currentDateProperty() {
return currentDate;
}
/**
* Indicates, whether the today button should be shown.
*
* @return The property.
*/
public BooleanProperty showTodayButtonProperty() {
return showTodayButton;
}
private BooleanProperty showTodayButton = new SimpleBooleanProperty(false);
public boolean getShowTodayButton() {
return showTodayButton.get();
}
public void setShowTodayButton(boolean showTodayButton) {
this.showTodayButton.set(showTodayButton);
}
/**
* The text of the today button
*
* @return The property.
*/
public StringProperty todayButtonTextProperty() {
return todayButtonText;
}
private StringProperty todayButtonText = new SimpleStringProperty("Today");
public String getTodayButtonText() {
return todayButtonText.get();
}
public void setTodayButtonText(String todayButtonText) {
this.todayButtonText.set(todayButtonText);
}
/**
* Indicates, whether the week numbers are shown.
*
* @return The property.
*/
public BooleanProperty showWeeksProperty() {
return showWeeks;
}
private BooleanProperty showWeeks = new SimpleBooleanProperty(false);
public boolean getShowWeeks() {
return showWeeks.get();
}
public void setShowWeeks(boolean showWeeks) {
this.showWeeks.set(showWeeks);
}
/**
* Package internal properties.
*/
MainNavigationPane mainNavigationPane;
/**
* Counts the current transitions. As long as an animation is going, the panels should not move left and right.
*/
IntegerProperty ongoingTransitions = new SimpleIntegerProperty(0);
ObjectProperty selectedDate = new SimpleObjectProperty();
ObjectProperty calendarDate = new SimpleObjectProperty();
IntegerProperty currentlyViewing = new SimpleIntegerProperty();
StringProperty title = new SimpleStringProperty();
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy