package Ġexample Ċ Ċ import Ġjava . awt .* Ġ// Ġk tl int - disable Ġno - wildcard - imports Ċ import Ġjava . time . DayOfWeek Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Year Month Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . time . format . TextStyle Ċ import Ġjava . time . temporal . Week Fields Ċ import Ġjava . util . Locale Ċ import Ġjavax . swing .* Ġ// Ġk tl int - disable Ġno - wildcard - imports Ċ import Ġjavax . swing . pl af . Layer UI Ċ import Ġjavax . swing . table . Default TableCell Renderer Ċ import Ġjavax . swing . table . Default TableModel Ċ Ċ private Ġval Ġmonth Label Ġ= ĠJLabel ("", ĠSw ing Constants . CENTER ) Ċ private Ġval Ġmonth Table Ġ= Ġobject Ġ: ĠJ Table () Ġ{ ĊĠ Ġprivate Ġfun Ġupdate Rows Height ( vp : ĠJ Viewport ) Ġ{ ĊĠĠĠ Ġval Ġheight Ġ= Ġvp . extent Size . height ĊĠĠĠ Ġval Ġrow Count Ġ= Ġmodel . rowCount ĊĠĠĠ Ġval Ġdefault Row Height Ġ= Ġheight Ġ/ Ġrow Count ĊĠĠĠ Ġvar Ġremainder Ġ= Ġheight Ġ% Ġrow Count ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrow Count ) Ġ{ ĊĠĠĠĠĠ Ġval Ġa Ġ= Ġ 1 . coerce At Most ( 0 . coerce At Least ( remainder -- )) ĊĠĠĠĠĠ Ġset Row Height ( i , Ġdefault Row Height Ġ+ Ġa ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdo Layout () Ġ{ ĊĠĠĠ Ġsuper . do Layout () ĊĠĠĠ Ġ( Swing Utilities . get Ancestor Of Class ( J Viewport :: class . java , Ġthis ) Ġas ? ĠJ Viewport )?. also Ġ{ ĊĠĠĠĠĠ Ġupdate Rows Height ( it ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ var Ġcurrent LocalDate : ĠLocalDate Ġ= ĠLocalDate . of ( 2 0 2 0 , Ġ 8 , Ġ 1 ) ĊĠ Ġprivate Ġset Ċ Ċ fun Ġupdate Month View ( local Date : ĠLocalDate ) Ġ{ ĊĠ Ġcurrent LocalDate Ġ= Ġlocal Date ĊĠ Ġmonth Label . text Ġ= Ġlocal Date . format ( DateTime Formatter . of Pattern (" yyyy Ġ/ ĠMM "). with Locale ( Locale . getDefault ())) ĊĠ Ġmonth Table . model Ġ= ĠCalendar View TableModel ( local Date ) Ċ } Ċ Ċ private Ġclass ĠCalendar Table Renderer Ġ: ĠDefault TableCell Renderer () Ġ{ ĊĠ Ġprivate Ġval Ġp Ġ= ĠJPanel () ĊĠ Ġoverride Ġfun Ġget TableCell Renderer Component ( ĊĠĠĠ Ġtable : ĠJ Table , ĊĠĠĠ Ġvalue : ĠAny ?, ĊĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠ Ġfocused : ĠBoolean , ĊĠĠĠ Ġrow : ĠInt , ĊĠĠĠ Ġcolumn : ĠInt ĊĠ Ġ): ĠComponent Ġ{ ĊĠĠĠ Ġval Ġc Ġ= Ġsuper . get TableCell Renderer Component ( table , Ġvalue , Ġselected , Ġfocused , Ġrow , Ġcolumn ) ĊĠĠĠ Ġif Ġ( value Ġis ĠLocalDate Ġ&& Ġc Ġis ĠJLabel ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext Week Day Ġ= Ġvalue . plus Days ( 7 ) ĊĠĠĠĠĠ Ġc . text Ġ= Ġvalue . day OfMonth . toString () ĊĠĠĠĠĠ Ġc . vertical Alignment Ġ= ĠSw ing Constants . TOP ĊĠĠĠĠĠ Ġc . horizontal Alignment Ġ= ĠSw ing Constants . LEFT ĊĠĠĠĠĠ Ġupdate Cell Week Color ( value , Ġc , Ġc ) ĊĊĠĠĠĠĠ Ġval Ġis Last Row Ġ= Ġrow Ġ== Ġtable . model . rowCount Ġ- Ġ 1 ĊĠĠĠĠĠ Ġif Ġ( is Last Row Ġ&& ĠYear Month . from ( value . plus Days ( 7 )) Ġ== ĠYear Month . from ( current LocalDate )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsub Ġ= ĠJLabel ( next Week Day . day OfMonth . toString ()) ĊĠĠĠĠĠĠĠ Ġsub . border Ġ= ĠBorder Factory . create Empty Border ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġsub . is Opaque Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsub . vertical Alignment Ġ= ĠSw ing Constants . BOTTOM ĊĠĠĠĠĠĠĠ Ġsub . horizontal Alignment Ġ= ĠSw ing Constants . RIGHT ĊĠĠĠĠĠĠĠ Ġp . removeAll () ĊĠĠĠĠĠĠĠ Ġp . layout Ġ= ĠBorderLayout () ĊĠĠĠĠĠĠĠ Ġp . add ( sub , ĠBorderLayout . SO UTH ) ĊĠĠĠĠĠĠĠ Ġp . add ( c , ĠBorderLayout . NORTH ) ĊĠĠĠĠĠĠĠ Ġp . border Ġ= Ġc . border ĊĠĠĠĠĠĠĠ Ġc . border Ġ= ĠBorder Factory . create Empty Border ( 1 , Ġ 1 , Ġ 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġupdate Cell Week Color ( value , Ġsub , Ġp ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJ Layer ( p , ĠDi agon ally Split Cell Layer UI ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġc ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Cell Week Color ( d : ĠLocalDate , Ġf gc : ĠJ Component , Ġbg c : ĠJ Component ) Ġ{ ĊĠĠĠ Ġif Ġ( Year Month . from ( d ) Ġ== ĠYear Month . from ( current LocalDate )) Ġ{ ĊĠĠĠĠĠ Ġf gc . foreground Ġ= ĠColor . BLACK ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġf gc . foreground Ġ= ĠColor . GRAY ĊĠĠĠ Ġ} ĊĠĠĠ Ġbg c . background Ġ= Ġget DayOfWeek Color ( d . day OfWeek ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget DayOfWeek Color ( d ow : ĠDay OfWeek ) Ġ= Ġwhen Ġ( d ow ) Ġ{ ĊĠĠĠ ĠDay OfWeek . S UND AY Ġ-> ĠColor ( 0 xFF _ DC _ DC ) ĊĠĠĠ ĠDay OfWeek . S ATUR DAY Ġ-> ĠColor ( 0 xDC _ DC _ FF ) ĊĠĠĠ Ġelse Ġ-> ĠColor . WHITE ĊĠ Ġ} Ċ } Ċ Ċ fun Ġmake UI (): ĠComponent Ġ{ ĊĠ Ġmonth Table . setDefault Renderer ( LocalDate :: class . java , ĠCalendar Table Renderer ()) ĊĠ Ġmonth Table . setSelection Mode ( List Selection Model . SINGLE _ SELECTION ) ĊĠ Ġmonth Table . cell Selection Enabled Ġ= Ġtrue ĊĠ Ġmonth Table . fill s Viewport Height Ġ= Ġtrue ĊĊĠ Ġval Ġheader Ġ= Ġmonth Table . table Header ĊĠ Ġheader . res izing Allowed Ġ= Ġfalse ĊĠ Ġheader . re ordering Allowed Ġ= Ġfalse ĊĠ Ġ( header . default Renderer Ġas ? ĠJLabel )?. horizontal Alignment Ġ= ĠSw ing Constants . CENTER ĊĠ Ġupdate Month View ( LocalDate . of ( 2 0 2 0 , Ġ 8 , Ġ 1 )) ĊĊĠ Ġval Ġprev Ġ= ĠJButton ("< ") ĊĠ Ġprev . addActionListener Ġ{ Ġupdate Month View ( current LocalDate . minus Months ( 1 )) Ġ} ĊĊĠ Ġval Ġnext Ġ= ĠJButton ("> ") ĊĠ Ġnext . addActionListener Ġ{ Ġupdate Month View ( current LocalDate . plus Months ( 1 )) Ġ} ĊĊĠ Ġval Ġp Ġ= ĠJPanel ( Border Layout ()) ĊĠ Ġp . add ( month Label ) ĊĠ Ġp . add ( prev , ĠBorderLayout . WEST ) ĊĠ Ġp . add ( next , ĠBorderLayout . EAST ) ĊĊĠ Ġval Ġscroll Ġ= ĠJ ScrollPane ( month Table ) ĊĠ Ġscroll . vertical ScrollBar Policy Ġ= ĠScroll Pane Constants . VERTICAL _ SCROLL BAR _ NE VER ĊĠ Ġscroll . horizontal ScrollBar Policy Ġ= ĠScroll Pane Constants . HORIZONTAL _ SCROLL BAR _ NE VER ĊĊĠ Ġreturn ĠJPanel ( Border Layout ()). also Ġ{ ĊĠĠĠ Ġit . add ( p , ĠBorderLayout . NORTH ) ĊĠĠĠ Ġit . add ( scroll ) ĊĠĠĠ Ġit . border Ġ= ĠBorder Factory . create Empty Border ( 5 , Ġ 5 , Ġ 5 , Ġ 5 ) ĊĠĠĠ Ġit . preferred Size Ġ= ĠDimension ( 3 2 0 , Ġ 2 4 0 ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠCalendar View TableModel ( date : ĠLocalDate ) Ġ: ĠDefault TableModel () Ġ{ ĊĠ Ġprivate Ġval ĠstartDate : ĠLocalDate ĊĠ Ġprivate Ġval Ġweek Fields Ġ= ĠWeek Fields . of ( Locale . getDefault ()) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġfirst Day OfMonth Ġ= ĠYear Month . from ( date ). at Day ( 1 ) ĊĠĠĠ Ġval Ġv Ġ= Ġfirst Day OfMonth [ week Fields . day OfWeek ()] Ġ- Ġ 1 ĊĠĠĠ ĠstartDate Ġ= Ġfirst Day OfMonth . minus Days ( v . to Long ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Column Class ( column : ĠInt ) Ġ= ĠLocalDate :: class . java ĊĊĠ Ġoverride Ġfun Ġget ColumnName ( column : ĠInt ): ĠString Ġ= ĊĠĠĠ Ġweek Fields . first DayOfWeek . plus ( column . to Long ()) ĊĠĠĠĠĠ Ġ. get DisplayName ( TextStyle . SHORT _ STAND AL ONE , ĠLocale . getDefault ()) ĊĊĠ Ġoverride Ġfun Ġget RowCount () Ġ= Ġ 5 ĊĊĠ Ġoverride Ġfun Ġget Column Count () Ġ= Ġ 7 ĊĊĠ Ġoverride Ġfun ĠgetValue At ( row : ĠInt , Ġcolumn : ĠInt ): ĠAny Ġ= ĊĠĠĠ ĠstartDate . plus Days ( row . to Long () Ġ* Ġcolumn Count Ġ+ Ġcolumn ) ĊĊĠ Ġoverride Ġfun Ġis Cell Editable ( row : ĠInt , Ġcolumn : ĠInt ) Ġ= Ġfalse Ċ } Ċ Ċ private Ġclass ĠDi agon ally Split Cell Layer UI Ġ: ĠLayer UI < JPanel >() Ġ{ ĊĠ Ġoverride Ġfun Ġpaint ( g : ĠGraphics , Ġc : ĠJ Component ) Ġ{ ĊĠĠĠ Ġsuper . paint ( g , Ġc ) ĊĠĠĠ Ġval Ġg 2 Ġ= Ġg . create () Ġas ? ĠGraphics 2 D Ġ?: Ġreturn ĊĠĠĠ Ġg 2 . set Rendering Hint ( Rendering Hints . KEY _ ANTI ALIAS ING , ĠRendering Hints . VALUE _ ANTI ALIAS _ ON ) ĊĠĠĠ Ġg 2 . paint Ġ= ĠUI Manager . getColor (" Table . grid Color ") ĊĠĠĠ Ġg 2 . draw Line ( c . width , Ġ 0 , Ġ 0 , Ġc . height ) ĊĠĠĠ Ġg 2 . dispose () ĊĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠ ĠEvent Queue . invoke Later Ġ{ ĊĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠ ĠUI Manager . set Look And Feel ( UI Manager . getSystem Look And Feel ClassName ()) ĊĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠ ĠToolkit . getDefault Toolkit (). be ep () ĊĠĠĠ Ġ} ĊĠĠĠ ĠJ Frame (). apply Ġ{ ĊĠĠĠĠĠ Ġdefault Close Operation Ġ= ĠWindow Constants . EXIT _ ON _ CLOSE ĊĠĠĠĠĠ Ġcontent Pane . add ( make UI ()) ĊĠĠĠĠĠ Ġpack () ĊĠĠĠĠĠ Ġset Location Relative To ( null ) ĊĠĠĠĠĠ Ġis Visible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ