I am trying to create a calendar out of JPanels but am getting an array index out of bounds for some reason and I don't know why. Can someone please help? It is not showing as an error in my code but I don't know where it could be miscounting the number of rows.
public class Calendar {
JTable calendar;
GregorianCalendar cal;
JPanel[][] dates;
public Calendar()
{
cal = new GregorianCalendar();
cal.set(2024, 3, 1);
String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
List<JPanel> mon = new ArrayList<JPanel>();
List<JPanel> tue = new ArrayList<JPanel>();
List<JPanel> wed = new ArrayList<JPanel>();
List<JPanel> thur = new ArrayList<JPanel>();
List<JPanel> fri = new ArrayList<JPanel>();
List<JPanel> sat = new ArrayList<JPanel>();
List<JPanel> sun = new ArrayList<JPanel>();
System.out.println(cal.get(GregorianCalendar.DAY_OF_WEEK));
while(cal.get(GregorianCalendar.MONTH) == 3)
{
int day = cal.get(GregorianCalendar.DAY_OF_WEEK);
switch(day)
{
case 2:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 2)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
mon.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
mon.add(new JPanel());
}
break;
case 3:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 3)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
tue.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
tue.add(new JPanel());
}
break;
case 4:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 4)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
wed.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
wed.add(new JPanel());
}
break;
case 5:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 5)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
thur.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
thur.add(new JPanel());
}
break;
case 6:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 6)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
fri.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
fri.add(new JPanel());
}
break;
case 7:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
sat.add(yub);
}
else if(cal.get(GregorianCalendar.DATE) == 1)
{
sat.add(new JPanel());
}
break;
case 1:
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 1)
{
JPanel yub = new JPanel();
JLabel meow = new JLabel(String.valueOf(cal.get(GregorianCalendar.DATE)));
yub.add(meow);
sun.add(yub);
}
break;
}
cal.roll(GregorianCalendar.DATE, true);
if(cal.get(GregorianCalendar.DATE) == 1)
{
break;
}
}
if(tue.size() != mon.size())
{
tue.add(new JPanel());
}
if(wed.size() != tue.size())
{
wed.add(new JPanel());
}
if(thur.size() != wed.size())
{
thur.add(new JPanel());
}
if(fri.size() != thur.size())
{
fri.add(new JPanel());
}
if(sat.size() != fri.size())
{
sat.add(new JPanel());
}
if(sun.size() != sat.size())
{
sun.add(new JPanel());
}
System.out.println(mon.size() + " " + tue.size() + " " + wed.size() + " " + thur.size() + " " + fri.size() +
" " + sat.size() + " " + sun.size());
tue.stream().forEach(x -> System.out.println(x.getComponentCount()));
JPanel[][] dates = {mon.toArray(new JPanel[mon.size()]), tue.toArray(new JPanel[tue.size()]),
wed.toArray(new JPanel[wed.size()]), thur.toArray(new JPanel[thur.size()]),
fri.toArray(new JPanel[fri.size()]), sat.toArray(new JPanel[sat.size()]),
sun.toArray(new JPanel[sun.size()])};
this.dates = dates;
calendar = new JTable(dates, days);
}
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at java.desktop/javax.swing.JTable$1.getValueAt(JTable.java:704)
at java.desktop/javax.swing.JTable.getValueAt(JTable.java:2706)
at java.desktop/javax.swing.JTable.prepareRenderer(JTable.java:5724)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2210)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2112)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1908)
at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5271)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:75)
at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:112)
at java.desktop/java.awt.Container.paint(Container.java:2003)
at java.desktop/java.awt.Window.paint(Window.java:3949)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at java.desktop/javax.swing.JTable$1.getValueAt(JTable.java:704)
at java.desktop/javax.swing.JTable.getValueAt(JTable.java:2706)
at java.desktop/javax.swing.JTable.prepareRenderer(JTable.java:5724)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2210)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2112)
at java.desktop/javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1908)
at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5271)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:75)
at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:112)
at java.desktop/java.awt.Container.paint(Container.java:2003)
at java.desktop/java.awt.Window.paint(Window.java:3949)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
I tried comparing the size of each List before converting to arrays and made sure that they were all the same but it seems to think that there is an extra row somewhere. It should create a table that is a calendar for the month.
Calendar
API and start making use of thejava.time.*
APIs instead - see the date/time trail for more detailsdates
array is actually[row][column]
ordering, so you're placing each on in each row, as apposed to interlacing the days on each row