I watched bunch of videos about swing and GUI in general and created my first component(correct me if it is not one). Here is the code: `JPanel` class: package gui.pane; import javax.swing.*; import javax.swing.event.EventListenerList; import java.awt.*; import java.text.DateFormatSymbols; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class CalendarPanel extends JPanel { private List<JButton> dateButtons = new ArrayList<>(); private Calendar selectedDate; private final JPanel datePanel; private EventListenerList listenerList = new EventListenerList(); public CalendarPanel() { this(Calendar.getInstance()); } public CalendarPanel(Calendar selectedDate) { this.selectedDate = selectedDate; setBorder(BorderFactory.createTitledBorder("Calendar")); // year combo box final JComboBox yearComboBox = new JComboBox<>(getYearList(selectedDate.get(Calendar.YEAR))); yearComboBox.addActionListener( e -> { selectedDate.set(Calendar.YEAR, (Integer) yearComboBox.getSelectedItem()); updateDateButtons(); } ); //month combo box final JComboBox monthComboBox = new JComboBox<>(new DateFormatSymbols().getMonths()); monthComboBox.setSelectedIndex(selectedDate.get(Calendar.MONTH)); monthComboBox.addActionListener( e -> { selectedDate.set(Calendar.MONTH, monthComboBox.getSelectedIndex()); updateDateButtons(); } ); // creating panels final JPanel calendarPanel = new JPanel(); calendarPanel.setLayout(new BorderLayout()); // create month and year panel final JPanel MonthAndYearPanel = new JPanel(); MonthAndYearPanel.setLayout(new FlowLayout()); // add year and month combo boxes to sub panel MonthAndYearPanel.add(yearComboBox); MonthAndYearPanel.add(monthComboBox); // creates date panel datePanel = new JPanel(); datePanel.setLayout(new GridBagLayout()); createDateButtons(); // add sub panels to main panel calendarPanel.add(MonthAndYearPanel, BorderLayout.PAGE_START); calendarPanel.add(datePanel, BorderLayout.PAGE_END); add(calendarPanel); } private Integer[] getYearList(int year) { Integer[] arr = new Integer[10]; for(int index = 0; index < 10; index++) { arr[index] = year + index; } return arr; } private void updateDateButtons(){ deleteDateButtons(); createDateButtons(); } private void deleteDateButtons() { dateButtons.stream().forEach(datePanel::remove); dateButtons = new ArrayList<>(); datePanel.revalidate(); datePanel.repaint(); } private void createDateButtons() { // sets date to first date of month selectedDate.set(Calendar.DATE, 1); // initializes grid GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.PAGE_START; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; gbc.weighty = 1; gbc.insets = new Insets(2,2,2,2); // placing buttons on the grid gbc.gridy = 0; gbc.gridx = selectedDate.get(Calendar.DAY_OF_WEEK) - 1; for(int index = 0; index < selectedDate.getActualMaximum(Calendar.DAY_OF_MONTH); index++) { JButton button = new JButton(String.valueOf(index + 1)); // adds actions listener to button button.addActionListener( e -> { selectedDate.set(Calendar.DATE, dateButtons.indexOf((JButton) e.getSource()) + 1); CalendarEvent calendarEvent = new CalendarEvent(e,selectedDate); fireCalendarEvent(calendarEvent); }); datePanel.add(button, gbc); dateButtons.add(button); gbc.gridx++; if (gbc.gridx == 7) { gbc.gridy++; gbc.gridx = 0; } } // resetting panel and date datePanel.revalidate(); datePanel.repaint(); } public void fireCalendarEvent(CalendarEvent event) { Object[] listeners = listenerList.getListenerList(); for(int index = 0; index < listeners.length; index += 2) { if (listeners[index] == CalendarListener.class) { ((CalendarListener) listeners[index + 1]).CalendarEventOccurred(event); } } } public void addCalendarListener(CalendarListener listener) { listenerList.add(CalendarListener.class, listener); } public void removeCalendarListener(CalendarListener listener) { listenerList.remove(CalendarListener.class, listener); } } `CalendarEvent` class: package gui.pane; import java.util.Calendar; import java.util.EventObject; public class CalendarEvent extends EventObject { private Calendar date; public CalendarEvent(Object source, Calendar date) { super(source); this.date = date; } public Calendar getDate() { return date; } } `CalendarListener` class: package gui.pane; import java.util.EventListener; public interface CalendarListener extends EventListener { public void CalendarEventOccurred(CalendarEvent event); } and `CinemaFrame` class: package gui; import gui.pane.CalendarPanel; import javax.swing.*; import java.awt.*; public class CinemaFrame extends JFrame { public CinemaFrame(String title) { super(title); setLayout(new GridBagLayout()); CalendarPanel calendarPanel = new CalendarPanel(); calendarPanel.addCalendarListener( e -> System.out.println(e.getSource())); add(calendarPanel); } } Basically this is little part of my homework. I have some questions: 1. I couldn't figure out a way to format this code so it wouldn't look messy, that why I added a lot of comments that doesn't really mean anything. I could make a bunch of functions, but then I would have to pass lot of arguments. That does not seem any less messy. How do you approach this? 2. Also I try to use latest features: lambda expressions, streams. There was places I couldn't figure out how to use them in some situations. For example here: `private Integer[] getYearList(int year) { Integer[] arr = new Integer[10]; for(int index = 0; index < 10; index++) { arr[index] = year + index; } return arr; }` I only could create `int` array: `IntStream.range(0, 10).map(i -> year + i).toArray();` So tell me where I could use something better then I have. 3. What else is on your mind to improving this code(patterns, naming, other built in classes, etc..)? ![Calendar image][1] [1]: https://i.sstatic.net/R1AMp.jpg