A Java framework for creating sophisticated calendar views (JavaFX 8, 9, 10, and 11)

Related tags

GUI CalendarFX
Overview

CalendarFX

A Java framework for creating sophisticated calendar views based on JavaFX. A detailed developer manual can be found online: CalendarFX 8 Developer Manual

Apache-2 license Build Status Maven Central Download LGTM Alerts LGTM Grade Bugs Code Smells Lines of Code Maintainability Rating Quality Gate Status Reliability Rating Security Rating Technical Debt Vulnerabilities

For a quick online demo please checkout JPro and their CalendarFX demo.

Screenshot

Repository Coordinates

CalendarFX can be found on Bintray and The Central Repository as com.calendarfx:view.

Modules

  • CalendarFXView — the main module containing the various calendar views
  • CalendarFXSampler — a demo app based on FXSampler to test controls individually
  • CalendarFXApp — a demo app (day, week, month, year views).
  • CalendarFXiCal — a demo app for working with iCalendar data
  • CalendarFXGoogle — a demo app for working with Google calendars
  • CalendarFXResourceApp — a demo app for the resource calendar view
  • CalendarFXWeather — a demo app for the month sheet view

Running

In the module folder of the corresponding app:

mvn javafx:run

Building

To install the package into the local repository, for use as a dependency in other projects locally:

mvn install
Comments
  • Can't create CalendarView in own Project

    Can't create CalendarView in own Project

    Hallo, I want to create my own project and embedd your calendar view. Therefore I created a Sample App. It's the same code than your "CalendarApp.java".

    I had to include the fontawesome .jars and your calendarfx .jars so I get no error but when running i get following error:

    **Caused by: java.lang.VerifyError: class impl.com.calendarfx.view.CalendarViewSkin$CustomMasterDetailPane overrides final method resetDividerPosition.()V** at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at com.calendarfx.view.CalendarView.createDefaultSkin(CalendarView.java:140) at javafx.scene.control.Control.impl_processCSS(Control.java:872) at javafx.scene.Node.processCSS(Node.java:9058) at javafx.scene.Scene.doCSSPass(Scene.java:545) at javafx.scene.Scene.preferredSize(Scene.java:1643) at javafx.scene.Scene.impl_preferredSize(Scene.java:1720) at javafx.stage.Window$9.invalidated(Window.java:846) at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109) at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144) at javafx.stage.Window.setShowing(Window.java:922) at javafx.stage.Window.show(Window.java:937) at javafx.stage.Stage.show(Stage.java:259) at sample.Main.start(Main.java:65) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) ... 1 more Exception running application sample.Main

    How can I solve this problem. I'm using Java 8.

    opened by Tobi2707 16
  • iCal4j recurrence

    iCal4j recurrence

    Fixes #50.

    Now the recurrence rule string is expected without a leading RRULE:, as that's how iCal4j does it. Otherwise we would have to manually remove the prefix every time we want to work with Recur.

    Is this change okay or is the mentioned workaround necessary?

    Aside from that most changes were simple, as the structure of both recurrence APIs is quite similar.

    Conversions between Date and LocalDate were done as shown in these Stack Overflow answers:

    LocalDateIteratorFactory was replaced with Recur.getDates.

    There are many occurrences of variables named rrule which type is now Recur. Shall I rename them accordingly or would that create too much noise?

    opened by mkroening 15
  • Pinning an entry on top of other entries

    Pinning an entry on top of other entries

    Hello Dirk, I would like to ask you about the possibility of drawing an entry on top of other entries (in ResourceCalendarView). As far as I know there is no such possibility at the moment - am I right?

    Would you consider adding it? The given entry would not be taken into account while calculating the overlapping (it would always stay on the top): calendarfx_entry_on_top

    The API I imagine could look like com.calendarfx.view.EntryViewBase#setOnTop(boolean) - so that we could use it in our extension of EntryViewBase like this:

    setOnTop(true);
    setPrefWidth(50);
    setAlignmentStrategy(AlignmentStrategy.ALIGN_RIGHT);
    

    What do you think about it?

    Cheers, Adrian

    enhancement 
    opened by adrianjaroszewicz 12
  • additional drag/drop enhancements

    additional drag/drop enhancements

    I am quite happy with this now.

    We now can recognize "mouse release" events outside of the calendar component because I listen on the scene now. I also added code to end the drag if the mouse leaves the application window at all.

    opened by imario42 12
  • Compute pref size height layout strategy is still using start-end time for computing overlapping

    Compute pref size height layout strategy is still using start-end time for computing overlapping

    I would like to calculate the height of an entry myself, basing on the amount of text that has been added to the titleLabel. In order to achieve that, I have added an extension of DayEntryView:

    public class DetailDayEntryView extends DayEntryView
    {
        public DetailDayEntryView( Entry< ? > entry )
        {
            super( entry );
            setHeightLayoutStrategy( EntryViewBase.HeightLayoutStrategy.COMPUTE_PREF_SIZE );
        }
    
        @Override
        protected double computePrefHeight( double width )
        {
            Label titleLabel = ((Label)lookup( ".title-label" ));
            if( titleLabel != null )
            {
                return titleLabel.prefHeight( width );
            }
            return super.computePrefHeight( width );
        }
    }
    

    that I use in my own EntryViewFactory:

    public class DayEntryViewFactory implements Callback< Entry< ? >, DayEntryView >
    {
        ...
        @Override
        public DayEntryView call( Entry< ? > anEntry )
        {
            return new DetailDayEntryView( anEntry );
        }
    

    and this code works great in most scenarios, the height of an entry is the same as height of a label.

    The problem appears when entries are overlapping. As far as I can see overlapping of entries is still based on their startTime and endTime - so even though an entry can fit in the view after reducing its height, it is still being rendered as it was overlapping with another one:

    calendarfx_overlapping_problem

    (dotted lines show the size of the entry when the end time is taken into account)

    I understand that this problem is not trivial. In the example above the height of an entry is less than using endTime so there is no overlapping - but when we change the height of an entry so that it is greater than height based on startTime and endTime, some additional overlapping can appear. In that case the width of the label decreases and basing on that, its height increases - so in order to present the whole text to the user, we would have to repeat the process until each entry has a proper height. It is our problem though - and I already have an idea how to solve it (I would have to introduce the maxEntryHeightProperty).

    But I cannot do it since endTime is not bound with the current height of the entry when using HeightLayoutStrategy.COMPUTE_PREF_SIZE strategy.

    PS. I have already tried to use com.calendarfx.model.Entry#changeEndTime(java.time.LocalTime) but after doing that I receive lots of exceptions:

    java.lang.IndexOutOfBoundsException: Index 55 out of bounds for length 55 at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[?:?] at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[?:?] at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) ~[?:?] at java.util.Objects.checkIndex(Objects.java:372) ~[?:?] at java.util.ArrayList.get(ArrayList.java:458) ~[?:?] at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89) ~[javafx-base-11.0.2-PSI-ALPHA-8-win.jar:?] at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306) ~[javafx-base-11.0.2-PSI-ALPHA-8-win.jar:?] at javafx.scene.Parent.layout(Parent.java:1210) ~[javafx-graphics-11.0.2-PSI-ALPHA-8-win.jar:?] at javafx.scene.Parent.layout(Parent.java:1213) ~[javafx-graphics-11.0.2-PSI-ALPHA-8-win.jar:?]

    with no reference to any mine or calendarfx code.

    opened by adrianjaroszewicz 11
  • Migrate to iCal4j 4

    Migrate to iCal4j 4

    This is my initial work on migrating to the iCal4j 4 API supporting the new Java date/time API. See iCal4j 4 and the new Java date/time API.

    I currently use the first alpha release, which has still bugs and is not stable jet. See iCal4j 4 Alpha Release.

    The main App seems to work fine, but I experience issues with the iCalApp, even without this patch. I'll look into that.

    What do you think?

    opened by mkroening 10
  • TimeScaleView - ability to adjust style of labels

    TimeScaleView - ability to adjust style of labels

    Hello Dirk, our client has a new requirement: ability to adjust style of labels in TimeScaleView.

    We think that following solution would be sufficient for us:

    Modifications in method impl.com.calendarfx.view.TimeScaleViewSkin#layoutChildrenInfiniteScrolling:

                if (midnight) {
                    label.setText(LocalDate.ofInstant(time, view.getZoneId()).format(getSkinnable().getDateFormatter()));
                    label.setStyle(getSkinnable().getDateStyleProvider().getStyle(time));
                } else {
                    label.setText(ZonedDateTime.ofInstant(time, view.getZoneId()).toLocalTime().format(getSkinnable().getTimeFormatter()));
                    label.setStyle(getSkinnable().getTimeStyleProvider().getStyle(time));
                }
    

    Modifications in class TimeScaleView:

        public interface TimeScaleStyleProvider {
            default String getStyle(Instant time) {
                return null;
            }
        }
        
        private static class DefaultTimeScaleStyleProvider implements TimeScaleStyleProvider {}
        
        private final ObjectProperty<TimeScaleStyleProvider> timeStyleProvider = new SimpleObjectProperty<>(this, "timeStyleProvider", new DefaultTimeScaleStyleProvider());
        private final ObjectProperty<TimeScaleStyleProvider> dateStyleProvider = new SimpleObjectProperty<>(this, "dateStyleProvider", new DefaultTimeScaleStyleProvider());
        
        public TimeScaleStyleProvider getTimeStyleProvider() {
            return timeStyleProvider.get();
        }
        public ObjectProperty<TimeScaleStyleProvider> timeStyleProviderProperty() {
            return timeStyleProvider;
        }
        public TimeScaleStyleProvider getDateStyleProvider() {
            return dateStyleProvider.get();
        }
        public ObjectProperty<TimeScaleStyleProvider> dateStyleProviderProperty() {
            return dateStyleProvider;
        }
    

    What do you think about the idea? Or maybe do you have any other ideas for achieving that? Would you be interested to introduce these changes directly in the CalendarFX?

    opened by PSI-Polska-ASM 7
  • Order of entries when the OverlapResolutionStrategy.VISUAL_BOUNDS has been chosen

    Order of entries when the OverlapResolutionStrategy.VISUAL_BOUNDS has been chosen

    Is it possible to control the order of entries when the OverlapResolutionStrategy.VISUAL_BOUNDS has been chosen? calendarfx_entries_sorting

    As it is being shown in the gif, I have connected two resource calendar views (they are bound using the scroll time property + entry from the view on the left has a corresponding entry in the view on the right). The view on the left uses the TIME_BOUNDS strategy and the view on the right uses the VISUAL_BOUNDS strategy.

    In order to present the dependency of entries in a more precise way, I have bound the selection in both views. To make it even more precise, I would like to sort entries located in the view on the right in the same order as corresponding entries from the view in the left (in this view there is more than one resource). The logic I would like to go with would probably look like

    Comparator.comparing( entry::dateFrom ).thenComparing( correspondingEntry::resourceTitle ).thenComparing( correspondingEntry::title )
    

    (fortunately the correspindingEntry::resourceTitle and correspindingEntry::title is a business information that I have access to in the scope of the entry from the view on the right)

    In the com.calendarfx.model.Entry#compareTo I have found a logic that is being used for sorting entries - but the method is final so there is no way for me to introduce an additional condition.

    But even if I was able to do so, there is one more obstacle: impl.com.calendarfx.view.util.VisualBoundsResolver#resolve. Here I can see a custom comparator that is based on the location of the entry. I'm not quite sure what is the purpose of such custom sorter - is it used for the sake of the performance? And probably my main question: Is it possible to override it somehow or run an additional sorting after placements have been determined? Or maybe there is another way for solving my issue that I haven't thought of?

    opened by adrianjaroszewicz 7
  • Day view ALIGN_LEFT stategy doesn't work with intersecting entries

    Day view ALIGN_LEFT stategy doesn't work with intersecting entries

    Inside the entry view factory the Entry1 entry view has set specific pref width and alignment strategy to ALIGN_LEFT:

    entryView.setPrefWidth(20);
    entryView.setAlignmentStrategy(EntryViewBase.AlignmentStrategy.ALIGN_LEFT);
    

    The Entry2 entry has default alignment strategy EntryViewBase.AlignmentStrategy.FILL

    When the Entry1 and Entry2 intersect and the Entry1 start time is later than the Entry2 start time, then the Entry1 is no longer on the left side of the day view. Please look at the image below: CalendarFX_align_left_strategy

    I would expect that after setting the EntryViewBase.AlignmentStrategy.ALIGN_LEFT, the entry view always shows up on the left side of the day view. Is it possible?

    opened by ftrela 7
  • Google calendar issue

    Google calendar issue

    I’ve been trying integrate the google calendar into a regular calendar view whereby when there’s an internet connection whereby the user is given the option to login to their google calendar rather than always requiring an internet connection to start the app. Is there any way I could get some assistance on that, I have been trying for a while. Thank you.

    help wanted 
    opened by TomisinSanni 7
  • Editing recurring events results in incorrect visualization

    Editing recurring events results in incorrect visualization

    Visualization of recurring events works as expected as long as the events are not updated after the initial load into a DateControl. However, if a recurring event is updated and the date visualised by the DateControl contains other events the result of updating (the time) of a recurring event is that the first event (or multiple events when editing a full day recurring event) of the viewed date is added to the DateControl. Forcing a full refresh of the view corrects the situation.

    The cause of this seems to be in how DayViewSkin and AllDayViewSkin handle updates of recurring events; updating a recurring event causes the skin to query the calendar for entries for the visualized date but it does not limit the processing of the result to the events associated by the updated event. Instead either the first event (DayViewSkin) or multiple events (AllDayViewSkin) of the date are added.

    opened by JBalthasar 6
  • Possible memory leak in ResourcesView

    Possible memory leak in ResourcesView

    This will present itself under two different scenarios

    1. Change type (RESOURCES_OVER_DATES / DATES_OVER_RESOURCES)
    2. Change resources

    Launch HelloResourcesView Toggle the type dropdown. After 25-30 times, JavaFX will break down and produce the stack trace below. The same will happen if you change number of resources enough times.

    Tested with JDK zulu11.60.19-ca-fx-jdk11.0.17-win_i686 (which bundles JavaFX 19.0.1)

    java.lang.NullPointerException
    	at javafx.graphics/com.sun.prism.impl.BaseContext.updateMaskTexture(BaseContext.java:266)
    	at javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.renderShape(BaseShaderGraphics.java:500)
    	at javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.drawLine(BaseShaderGraphics.java:1788)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.handleRenderOp(NGCanvas.java:1220)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:1104)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:610)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2207)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2233)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2207)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2233)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2207)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2233)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2207)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2233)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
    	at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
    	at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:480)
    	at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:329)
    	at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:92)
    	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    	at java.base/java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:305)
    	at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
    	at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:126)
    	at java.base/java.lang.Thread.run(Thread.java:829)
    
    opened by andersb 0
  • MonthViewSkin: Assigning null to a primitive. (V11.12.3)

    MonthViewSkin: Assigning null to a primitive. (V11.12.3)

    I'm getting exceptions in MonthViewSkin$MonthDayEntriesPane.update(MonthViewSkin.java:675) because the return value of a map lookup is assigned to an int even though it may be null:

    Trace:

    Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null at impl.com.calendarfx.view.MonthViewSkin$MonthDayEntriesPane.update(MonthViewSkin.java:675) at impl.com.calendarfx.view.MonthViewSkin$MonthDayEntriesPane.lambda$new$0(MonthViewSkin.java:632) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)

    opened by baumeister 0
  • Make it possible to prevent creation of multi-day entries

    Make it possible to prevent creation of multi-day entries

    There should be a flag telling the calendar whether the user should be able to create entries spanning more than one day. It many domains this is never a possible operation, e.g. "barber shop".

    enhancement 
    opened by dlemmermann 0
  • Support defining exceptions for recurrence rules

    Support defining exceptions for recurrence rules

    "There is currently no support for defining exceptions for recurrence rules. In most calendar applications, when the user edits a recurrent entry, the user will be asked whether he wants to change just this one recurrence or the whole series. This feature is currently not supported but will be in one of the next releases." (CalendarFX manual - Known Issues)

    This issue is meant to track any progress on this. I think that, without this feature, this library is nearly unusable for many use cases (including mine).

    Dialog of GNOME Calendar 3.32.2, when pressing apply after editing a recurring event for reference: gnome-calendar-edit-recurring

    Has work on this started already? How can I help?

    enhancement 
    opened by mkroening 7
Releases(v11.12.3)
Owner
DLSC Software & Consulting GmbH
DLSC Software & Consulting GmbH
A framework for easily creating forms for a JavaFX UI.

FormsFX Forms for business application made easy. Creating forms in Java has never been this easy! Maven To use this framework as part of your Maven b

DLSC Software & Consulting GmbH 534 Dec 30, 2022
A library for creating and editing graph-like diagrams in JavaFX.

Graph Editor A library for creating and editing graph-like diagrams in JavaFX. This project is a fork of tesis-dynaware/graph-editor 1.3.1, which is n

Steffen 125 Jan 1, 2023
A framework for easily creating a UI for application settings / preferences.

PreferencesFX Preference dialogs for business applications made easy. Creating preference dialogs in Java has never been this easy! Table of Contents

DLSC Software & Consulting GmbH 545 Dec 22, 2022
Lib-Tile is a multi Maven project written in JavaFX and NetBeans IDE 8 and provides the functionalities to use and handle easily Tiles in your JavaFX application.

Lib-Tile Intention Lib-Tile is a multi Maven project written in JavaFX and NetBeans IDE and provides the functionalities to use and handle easily Tile

Peter Rogge 13 Apr 13, 2022
DataFX - is a JavaFX frameworks that provides additional features to create MVC based applications in JavaFX by providing routing and a context for CDI.

What you’ve stumbled upon here is a project that intends to make retrieving, massaging, populating, viewing, and editing data in JavaFX UI controls ea

Guigarage 110 Dec 29, 2022
Tray Icon implementation for JavaFX applications. Say goodbye to using AWT's SystemTray icon, instead use a JavaFX Tray Icon.

FXTrayIcon Library intended for use in JavaFX applications that makes adding a System Tray icon easier. The FXTrayIcon class handles all the messy AWT

Dustin Redmond 248 Dec 30, 2022
😉PrettyZoo is a GUI for Zookeeper created by JavaFX and Apache Curator Framework.

?? Pretty nice Zookeeper GUI, Support Win / Mac / Linux Platform

vran 2.4k Jan 5, 2023
Tool for creating custom GUIs using packets.

Tool for creating custom GUIs using packets.

Geo3gamer 0 Feb 14, 2022
Docking framework for JavaFX platform

Docking framework for JavaFX platform AnchorFX is a gratis and open source library for JavaFX to create graphical interfaces with docking features Anc

Alessio Vinerbi 197 Oct 15, 2022
A JavaFX UI framework to create fully customized undecorated windows

CustomStage A JavaFX undecorated stage which can fully be customized Donations If this project is helpful to you and love my work and feel like showin

Oshan Mendis 186 Jan 6, 2023
Desktop/Mobile JavaFX application framework

Basilisk is desktop/mobile application development platform for the JVM. Inspired by Griffon, Basilisk leverages JavaFX and JavafXPorts to bring the s

Basilisk 55 Feb 10, 2022
an Application Framework for implementing the MVVM Pattern with JavaFX

mvvmFX is an application framework which provides you necessary components to implement the MVVM pattern with JavaFX. MVVM is the enhanced version of

Alexander Casall 438 Dec 28, 2022
Lightweight JavaFX Framework for Kotlin

TornadoFX JavaFX Framework for Kotlin Important: TornadoFX is not yet compatible with Java 9/10 Oracle is intending to decouple JavaFX from the JDK. W

Edvin Syse 3.6k Dec 29, 2022
A lightweight RCP framework for JavaFX applications.

WorkbenchFX The one and only framework to build large JavaFX Applications! Maven To use this framework as part of your Maven build simply add the foll

DLSC Software & Consulting GmbH 471 Jan 8, 2023
JavaFX micro-framework that follows MVVM Pattern with Google Guice dependency Injection

ReactiveDeskFX (JavaFX and Google Guice MVVM Pattern micro-framework) JavaFX micro-framework to develop very fast JavaFX components with minimal code

TangoraBox 3 Jan 9, 2022
Lobby System Template for a multiplayer java game, with chat and other features, using JavaFX and socket TCP (will be extended to UDP).

JavaFX-MultiplayerLobbySystem JavaFX lobby system for multiplayer games with chat, ready toggle and kick buttons, using socket TCP by default. Demo Cr

Michele Righi 7 May 8, 2022
A simple JavaFX application to load, save and edit a CSV file and provide a JSON configuration for columns to check the values in the columns.

SmartCSV.fx Description A simple JavaFX application to load, save and edit a CSV file and provide a JSON Table Schema for columns to check the values

Andreas Billmann 74 Oct 24, 2022
📊 Exposing charts from Java to JavaFX and the Web!

Exposing charts from Java to JavaFX and to the Web! JavaFX · Charts · Websockets · Jetty · Web JavaFxDataviewer is an open-source data visualization t

jasrodis 57 Oct 26, 2022