I am trying to create an event calendar using Java. I cannot seem to find a way
ID: 666050 • Letter: I
Question
I am trying to create an event calendar using Java. I cannot seem to find a way to add events to the days in the months. I was thinking maybe a free text field when I click on each day. any help with this would be greatly appreciated.
Here is the code I have for the calendar so far :
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* Bean to display a month calendar in a JPanel. Only works for the Western
* calendar.
*/
public class Cal extends JPanel {
/** The currently-interesting year (not modulo 1900!) */
protected int yy;
/** Currently-interesting month and day */
protected int mm, dd;
/** The buttons to be displayed */
protected JButton labs[][];
/** The number of day squares to leave blank at the start of this month */
protected int leadGap = 0;
/** A Calendar object used throughout */
Calendar calendar = new GregorianCalendar();
/** Today's year */
protected final int thisYear = calendar.get(Calendar.YEAR);
/** Today's month */
protected final int thisMonth = calendar.get(Calendar.MONTH);
/** One of the buttons. We just keep its reference for getBackground(). */
private JButton b0;
/** The month choice */
private JComboBox monthChoice;
/** The year choice */
private JComboBox yearChoice;
/**
* Construct a Cal, starting with today.
*/
Cal() {
super();
setYYMMDD(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
buildGUI();
recompute();
}
/**
* Construct a Cal, given the leading days and the total days
*
* @exception IllegalArgumentException
* If year out of range
*/
Cal(int year, int month, int today) {
super();
setYYMMDD(year, month, today);
buildGUI();
recompute();
}
private void setYYMMDD(int year, int month, int today) {
yy = year;
mm = month;
dd = today;
}
String[] months = { "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" };
/** Build the GUI. Assumes that setYYMMDD has been called. */
private void buildGUI() {
getAccessibleContext().setAccessibleDescription(
"Calendar not accessible yet. Sorry!");
setBorder(BorderFactory.createEtchedBorder());
setLayout(new BorderLayout());
JPanel tp = new JPanel();
tp.add(monthChoice = new JComboBox());
for (int i = 0; i < months.length; i++)
monthChoice.addItem(months[i]);
monthChoice.setSelectedItem(months[mm]);
monthChoice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int i = monthChoice.getSelectedIndex();
if (i >= 0) {
mm = i;
// System.out.println("Month=" + mm);
recompute();
}
}
});
monthChoice.getAccessibleContext().setAccessibleName("Months");
monthChoice.getAccessibleContext().setAccessibleDescription(
"Choose a month of the year");
tp.add(yearChoice = new JComboBox());
yearChoice.setEditable(true);
for (int i = yy - 5; i < yy + 5; i++)
yearChoice.addItem(Integer.toString(i));
yearChoice.setSelectedItem(Integer.toString(yy));
yearChoice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int i = yearChoice.getSelectedIndex();
if (i >= 0) {
yy = Integer.parseInt(yearChoice.getSelectedItem()
.toString());
// System.out.println("Year=" + yy);
recompute();
}
}
});
add(BorderLayout.CENTER, tp);
JPanel bp = new JPanel();
bp.setLayout(new GridLayout(7, 7));
labs = new JButton[6][7]; // first row is days
bp.add(b0 = new JButton("S"));
bp.add(new JButton("M"));
bp.add(new JButton("T"));
bp.add(new JButton("W"));
bp.add(new JButton("R"));
bp.add(new JButton("F"));
bp.add(new JButton("S"));
ActionListener dateSetter = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String num = e.getActionCommand();
if (!num.equals("")) {
// set the current day highlighted
setDayActive(Integer.parseInt(num));
// When this becomes a Bean, you can
// fire some kind of DateChanged event here.
// Also, build a similar daySetter for day-of-week btns.
}
}
};
// Construct all the buttons, and add them.
for (int i = 0; i < 6; i++)
for (int j = 0; j < 7; j++) {
bp.add(labs[i][j] = new JButton(""));
labs[i][j].addActionListener(dateSetter);
}
add(BorderLayout.SOUTH, bp);
}
public final static int dom[] = { 31, 28, 31, 30, /* jan feb mar apr */
31, 30, 31, 31, /* may jun jul aug */
30, 31, 30, 31 /* sep oct nov dec */
};
/** Compute which days to put where, in the Cal panel */
protected void recompute() {
// System.out.println("Cal::recompute: " + yy + ":" + mm + ":" + dd);
if (mm < 0 || mm > 11)
throw new IllegalArgumentException("Month " + mm
+ " bad, must be 0-11");
clearDayActive();
calendar = new GregorianCalendar(yy, mm, dd);
// Compute how much to leave before the first.
// getDay() returns 0 for Sunday, which is just right.
leadGap = new GregorianCalendar(yy, mm, 1).get(Calendar.DAY_OF_WEEK) - 1;
// System.out.println("leadGap = " + leadGap);
int daysInMonth = dom[mm];
if (isLeap(calendar.get(Calendar.YEAR)) && mm == 1)
// if (isLeap(calendar.get(Calendar.YEAR)) && mm > 1)
++daysInMonth;
// Blank out the labels before 1st day of month
for (int i = 0; i < leadGap; i++) {
labs[0][i].setText("");
}
// Fill in numbers for the day of month.
for (int i = 1; i <= daysInMonth; i++) {
JButton b = labs[(leadGap + i - 1) / 7][(leadGap + i - 1) % 7];
b.setText(Integer.toString(i));
}
// 7 days/week * up to 6 rows
for (int i = leadGap + 1 + daysInMonth; i < 6 * 7; i++) {
labs[(i) / 7][(i) % 7].setText("");
}
// Shade current day, only if current month
if (thisYear == yy && mm == thisMonth)
setDayActive(dd); // shade the box for today
// Say we need to be drawn on the screen
repaint();
}
/**
* isLeap() returns true if the given year is a Leap Year.
*
* "a year is a leap year if it is divisible by 4 but not by 100, except
* that years divisible by 400 *are* leap years." -- Kernighan & Ritchie,
* _The C Programming Language_, p 37.
*/
public boolean isLeap(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
return false;
}
/** Set the year, month, and day */
public void setDate(int yy, int mm, int dd) {
// System.out.println("Cal::setDate");
this.yy = yy;
this.mm = mm; // starts at 0, like Date
this.dd = dd;
recompute();
}
/** Unset any previously highlighted day */
private void clearDayActive() {
JButton b;
// First un-shade the previously-selected square, if any
if (activeDay > 0) {
b = labs[(leadGap + activeDay - 1) / 7][(leadGap + activeDay - 1) % 7];
b.setBackground(b0.getBackground());
b.repaint();
activeDay = -1;
}
}
private int activeDay = -1;
/** Set just the day, on the current month */
public void setDayActive(int newDay) {
clearDayActive();
// Set the new one
if (newDay <= 0)
dd = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);
else
dd = newDay;
// Now shade the correct square
Component square = labs[(leadGap + newDay - 1) / 7][(leadGap + newDay - 1) % 7];
square.setBackground(Color.red);
square.repaint();
activeDay = newDay;
}
/** For testing, a main program */
public static void main(String[] av) {
JFrame f = new JFrame("Cal");
Container c = f.getContentPane();
c.setLayout(new FlowLayout());
// for this test driver, hardcode 1995/02/10.
c.add(new Cal(1995, 2 - 1, 10));
// and beside it, the current month.
c.add(new Cal());
f.pack();
f.setVisible(true);
}
}
Explanation / Answer
import database.EVDBManagement; import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.util.*; import model.EventModel; import ui.dialog.AddEvent; /** * * @author Yumi Takuma */ public class EventCalendar extends JPanel { JLabel lblMonth, lblYear; JButton btnPrev, btnNext, addEvent; JTable tblCalendar; JComboBox cmbYear; Container pane; DefaultTableModel mtblCalendar; //Table model JScrollPane stblCalendar; //The scrollpane JPanel pnlCalendar; int realYear, realMonth, realDay, currentYear, currentMonth; private EVDBManagement ev = new EVDBManagement(); private ArrayList e = new ArrayList(); public EventCalendar() { e = ev.getEvents(); //Prepare frame this.setLayout(null); //Apply null layout //Create controls lblMonth = new JLabel("January"); lblYear = new JLabel("Change year:"); cmbYear = new JComboBox(); btnPrev = new JButton(""); mtblCalendar = new DefaultTableModel() { public boolean isCellEditable(int rowIndex, int mColIndex) { return false; } }; addEvent = new JButton("Add Event", new ImageIcon("res/buttons/add.png")); tblCalendar = new JTable(mtblCalendar); stblCalendar = new JScrollPane(tblCalendar); pnlCalendar = new JPanel(null); //Set border pnlCalendar.setBorder(BorderFactory.createTitledBorder("Calendar")); //Register action listeners btnPrev.addActionListener(new btnPrev_Action()); btnNext.addActionListener(new btnNext_Action()); cmbYear.addActionListener(new cmbYear_Action()); //Add controls to pane this.add(pnlCalendar); pnlCalendar.add(lblMonth); pnlCalendar.add(lblYear); pnlCalendar.add(cmbYear); pnlCalendar.add(btnPrev); pnlCalendar.add(btnNext); pnlCalendar.add(addEvent); pnlCalendar.add(stblCalendar); //Set bounds pnlCalendar.setSize(380, 380); lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25, 100, 25); lblYear.setBounds(15, 305, 80, 20); cmbYear.setBounds(275, 305, 80, 20); btnPrev.setBounds(10, 25, 50, 25); btnNext.setBounds(310, 25, 50, 25); addEvent.setBounds(310, 355, 50, 25); stblCalendar.setBounds(10, 50, 350, 300); //Get real month/year GregorianCalendar cal = new GregorianCalendar(); //Create calendar realDay = cal.get(GregorianCalendar.DAY_OF_MONTH); //Get day realMonth = cal.get(GregorianCalendar.MONTH); //Get month realYear = cal.get(GregorianCalendar.YEAR); //Get year currentMonth = realMonth; //Match month and year currentYear = realYear; //Add headers String[] headers = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //All headers for (int i = 0; i < 7; i++) { mtblCalendar.addColumn(headers[i]); } tblCalendar.getParent().setBackground(tblCalendar.getBackground()); //Set background //No resize/reorder tblCalendar.getTableHeader().setResizingAllowed(false); tblCalendar.getTableHeader().setReorderingAllowed(false); //Single cell selection tblCalendar.setColumnSelectionAllowed(true); tblCalendar.setRowSelectionAllowed(true); tblCalendar.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //Set row/column count tblCalendar.setRowHeight(38); mtblCalendar.setColumnCount(7); mtblCalendar.setRowCount(6); //Populate table for (int i = realYear - 50; iRelated Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.