I'm working on an application that has the user open a calendar view, and schedule different tasks (similar to what you can do in outlook). I have the Calendar view, but don't know where to go from here. This is borrowed code btw. I've updated some of it to meet some of my intent.
I'm thinking of using mysql as the database to store the task dates, but how do I populate my calendar with the dates from the database? I've attached the borrowed code. Any suggestions are welcome...
//Import packages
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class ViewCalendar {
JLabel lblMonth, lblYear;
JButton btnPrev, btnNext;
JTable tblCalendar;
JComboBox cmbYear;
JFrame frmMain;
Container pane;
DefaultTableModel mtblCalendar; //Table model
JScrollPane stblCalendar; //The scrollpane
JPanel pnlCalendar;
int realYear, realMonth, realDay, currentYear, currentMonth;
public void viewCalendar() {
System.out.println("*Calendar open*");
//Look and feel
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (UnsupportedLookAndFeelException e) {
}
//Prepare frame
frmMain = new JFrame("Scheduled Repairs"); //Create frame
frmMain.setSize(330, 375); //Set size to 400x400 pixels
pane = frmMain.getContentPane(); //Get content pane
pane.setLayout(null); //Apply null layout
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Close when X is clicked
//Create controls
lblMonth = new JLabel("January");
lblYear = new JLabel("Change year:");
cmbYear = new JComboBox();
btnPrev = new JButton("<<");
btnNext = new JButton(">>");
mtblCalendar = new DefaultTableModel() {
public boolean isCellEditable(int rowIndex, int mColIndex) {
return false;
}
};
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
pane.add(pnlCalendar);
pnlCalendar.add(lblMonth);
pnlCalendar.add(lblYear);
pnlCalendar.add(cmbYear);
pnlCalendar.add(btnPrev);
pnlCalendar.add(btnNext);
pnlCalendar.add(stblCalendar);
//Set bounds
pnlCalendar.setBounds(0, 0, 320, 335);
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25, 100, 25);
lblYear.setBounds(10, 305, 80, 20);
cmbYear.setBounds(230, 305, 80, 20);
btnPrev.setBounds(10, 25, 50, 25);
btnNext.setBounds(260, 25, 50, 25);
stblCalendar.setBounds(10, 50, 300, 250);
//Make frame visible
frmMain.setResizable(true);
frmMain.setVisible(true);
//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 - 100; i <= realYear + 100; i++) {
cmbYear.addItem(String.valueOf(i));
}
//Refresh calendar
refreshCalendar(realMonth, realYear); //Refresh calendar
}
public void refreshCalendar(int month, int year) {
//Variables
String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int nod, som; //Number Of Days, Start Of Month
//Allow/disallow buttons
btnPrev.setEnabled(true);
btnNext.setEnabled(true);
if (month == 0 && year <= realYear - 10) {
btnPrev.setEnabled(false);
} //Too early
if (month == 11 && year >= realYear + 100) {
btnNext.setEnabled(false);
} //Too late
lblMonth.setText(months[month]); //Refresh the month label (at the top)
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25, 180, 25); //Re-align label with calendar
cmbYear.setSelectedItem(String.valueOf(year)); //Select the correct year in the combo box
//Clear table
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
mtblCalendar.setValueAt(null, i, j);
}
}
//Get first day of month and number of days
GregorianCalendar cal = new GregorianCalendar(year, month, 1);
nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
som = cal.get(GregorianCalendar.DAY_OF_WEEK);
//Draw calendar
for (int i = 1; i <= nod; i++) {
int row = new Integer((i + som - 2) / 7);
int column = (i + som - 2) % 7;
mtblCalendar.setValueAt(i, row, column);
}
//Apply renderers
tblCalendar.setDefaultRenderer(tblCalendar.getColumnClass(0), new tblCalendarRenderer());
}
class tblCalendarRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean selected, boolean focused, int row, int column) {
super.getTableCellRendererComponent(table, value, selected, focused, row, column);
if (column == 0 || column == 6) { //Week-end
setBackground(new Color(255, 220, 220));
} else { //Week
setBackground(new Color(255, 255, 255));
}
if (value != null) {
if (Integer.parseInt(value.toString()) == realDay && currentMonth == realMonth && currentYear == realYear) { //Today
setBackground(new Color(220, 220, 255));
}
}
setBorder(null);
setForeground(Color.black);
return this;
}
}
class btnPrev_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 0) { //Back one year
currentMonth = 11;
currentYear -= 1;
} else { //Back one month
currentMonth -= 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
class btnNext_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 11) { //Foward one year
currentMonth = 0;
currentYear += 1;
} else { //Foward one month
currentMonth += 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
class cmbYear_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (cmbYear.getSelectedItem() != null) {
String b = cmbYear.getSelectedItem().toString();
currentYear = Integer.parseInt(b);
refreshCalendar(currentMonth, currentYear);
}
}
}
}
Related
I have attached two codes here, one with Class name "CalenderApplication" which is a java swing application and the other is with Class name "JavaCalender".
What I want to do is to create a java swing application like the one with Class name "CalenderApplication" but to include a character next to date like I did with the code with Class name "JavaCalender"
If you run the code with Class "Java Calender" you will see it has a character next to the date but I want it to be a java swing Application.
Calender Application
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class CalenderApplication extends JFrame {
DefaultTableModel model;
Calendar cal = new GregorianCalendar();
JLabel label; SwingCalendar() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("Swing Calandar");
this.setSize(300,200);
this.setLayout(new BorderLayout());
this.setVisible(true);
label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER);
JButton b1 = new JButton("prev.");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
cal.add(Calendar.MONTH, -1);
updateMonth();
}
});
JButton b2 = new JButton("next");
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
cal.add(Calendar.MONTH, +1);
updateMonth();
}
});
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout()); panel.add(b1,BorderLayout.WEST);
panel.add(label,BorderLayout.CENTER); panel.add(b2,BorderLayout.EAST);
String [] columns = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
model = new DefaultTableModel(null,columns);
JTable table = new JTable(model);
JScrollPane pane = new JScrollPane(table);
this.add(panel,BorderLayout.NORTH); this.add(pane,BorderLayout.CENTER);
this.updateMonth();
}
void updateMonth() {
cal.set(Calendar.DAY_OF_MONTH, 1);
String month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.US);
int year = cal.get(Calendar.YEAR);
label.setText(month + " " + year);
int startDay = cal.get(Calendar.DAY_OF_WEEK);
int numberOfDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
int weeks = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
model.setRowCount(0);
model.setRowCount(weeks);
int i = startDay-1;
for(int day=1; day<=numberOfDays; day++) {
model.setValueAt(day, i/7 , i%7 );
i = i + 1;
}
}
public static void main(String[] arguments) {
JFrame.setDefaultLookAndFeelDecorated(true);
CalenderApplication sc = new CalenderApplication();
}
}
Java Calender
import java.util.Calendar;
import java.util.Scanner;
import java.util.GregorianCalendar;
import java.util.Locale;
public class JavaCalender {
static int theCount = 0;
public static void main(String[] args) {
int year = 2022;
int yearCounter = 2022;
Calendar cal = new GregorianCalendar();
int startDay;
int numberOfDays;
int monthCount = 1;
for (int i=5; i<42; i++){
cal.set(year, i, 1);
startDay = cal.get(Calendar.DAY_OF_WEEK);
numberOfDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
if (i == 24) {
yearCounter = yearCounter + 1;
}
if (i == 12) {
yearCounter = yearCounter + 1;
}
System.out.println();
System.out.print(cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.US));
//System.out.println( " " + year);
System.out.println( " " + yearCounter);
printMonth(numberOfDays,startDay);
System.out.println();
}
}
private static void printMonth(int numberOfDays, int startDay) {
String[] alphabet = {"|A","|B","|C","|D","|E","|F","|G","|H","|I","|J","|K","|L","|N","|O","|P","|Q","|R","|S","|T","|U","|V",""};
int weekdayIndex = 0;
System.out.println("Sund Mond Tues Wedn Thur Frid Sata");
for (int day = 1; day < startDay; day++) {
System.out.print(" ");
weekdayIndex++;
}
for (int day = 1; day <= numberOfDays; day++) {
System.out.printf("%1$2d", day);
if (theCount < 21) {
System.out.print(alphabet[theCount]);
}
theCount++;
if (theCount == 21) {
theCount = 0;
}
weekdayIndex++;
if (weekdayIndex == 7) {
weekdayIndex = 0;
System.out.println();
}
else {
System.out.print(" ");
}
}
System.out.println();
}
}
Any kind of help will be appreciated!
So I have a Calendar GUI using a borderlayout. There is a header (north) with combo boxes of month and years. When I select an item in the month combo box say, June, then it will update the calendar and repaint the center (The center has 42 JButtons). The center is a JPanel filled with button. The buttons are intractable to display events of that day (Just listing as much information as I can).
My problem is repainting the panel and stretching the frame. When I stretch the frame, for some reason the Center Panel repeats itself. When I call revalidate, it continues to repeat itself.
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
public class cPan extends JPanel implements ChangeListener
{
String date;
public HashMap<String, ArrayList<Event>> haM;
DataModel data;
JButton dayB;
MyCalendar cal;
public cPan(MyCalendar c, HashMap<String, ArrayList<Event>> hm, DataModel d)
{
haM = hm;
data = d;
cal = c;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
System.out.println(month);
int day = cal.get(Calendar.DAY_OF_MONTH);
int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
Calendar calForDay = Calendar.getInstance();
calForDay.set(Calendar.DATE, day);
calForDay.set(Calendar.MONTH, month);
calForDay.set(Calendar.YEAR, year);
calForDay.set(Calendar.DAY_OF_MONTH, 1);
Date firstDayOfMonth = calForDay.getTime();
int counter = 0;
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
String fDOM = sdf.format(firstDayOfMonth);
//print empty buttons
if(fDOM.equalsIgnoreCase("SUNDAY")) {counter = 1;}
if(fDOM.equalsIgnoreCase("MONDAY")) {counter = 2;}
if(fDOM.equalsIgnoreCase("TUESDAY")) {counter = 3;}
if(fDOM.equalsIgnoreCase("WEDNESDAY")) {counter = 4;}
if(fDOM.equalsIgnoreCase("THURSDAY")) {counter = 5;}
if(fDOM.equalsIgnoreCase("FRIDAY")) {counter = 6;}
if(fDOM.equalsIgnoreCase("SATURDAY")) {counter = 7;}
setLayout(new GridLayout(7,7));
DAYS[] arrOfDays = DAYS.values();
for(DAYS s : arrOfDays)
{
dayB = new JButton(s.name());
dayB.setBackground(new Color(255, 204, 153 , 255));
add(dayB);
}
for (int j = 1; j < counter; j++)
{
dayB.setBackground(new Color(255, 229, 204, 255));
dayB = new JButton("");
add(dayB);
}
//print day buttons
for(int i = 1; i <= daysInMonth; i++)
{
String dayNum = String.valueOf(i);
String monthNum = String.valueOf(month + 1);
String yearNum = String.valueOf(year);
String dayNum2 = dayNum;
if(dayNum.length() == 1)
{
dayNum2 = "0" + dayNum;
}
if(String.valueOf(month).length() == 1)
{
monthNum = "0" + monthNum;
}
date = yearNum + monthNum + dayNum2;
dayB = new JButton(dayNum);
if(i == day)
{
dayB.setBackground(new Color(153, 255, 153, 255));
}
else if(haM.containsKey(date))
{
dayB.setBackground(new Color(255, 255, 153, 255));
}
else
{
dayB.setBackground(new Color(255, 229, 204, 255));
}
dayB.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
DayFrame dayF = new DayFrame(date, haM);
}
});
add(dayB);
counter++;
}
//print empty buttons
for(int i = counter; i <= 42; i++)
{
dayB = new JButton("");
dayB.setBackground(new Color(255, 229, 204, 255));
add(dayB);
}
}
public void stateChanged(ChangeEvent e) {
System.out.println("Something is going on in statechange");
cal.set(Calendar.MONTH, 10); // only did this to test it out
cPan.this.revalidate();
cPan.this.repaint();
}
}
Your paintComponent method is doing many things that it should never do, such as create and place components. It should paint and paint only.
I suggest that instead you place your components into your GUI inside of your class's constructor, and again use paintComponent just for painting and nothing else. If you're wanting to display a calendar, consider displaying each day as a JPanel held in a GridLayout-using JPanel. The DayPanel could be in its own class in order to refactor out the information.
Also, you should rename your class, since by convention class names should begin with an upper case letter, and so something like CalendarPanel would be better.
I am looking for ideas and suggestions on how to go about adding events that can be created and edited to my swing app.
I would like the app to stay fairly basic, but know that I will/should link it to a database to hold the events.
Here is the current code that
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CalendarProgram {
static JLabel lblMonth, lblYear;
static JButton btnPrev, btnNext;
static JTable tblCalendar;
static JComboBox cmbYear;
static JFrame frmMain;
static Container pane;
static DefaultTableModel mtblCalendar; // Table model
static JScrollPane stblCalendar; // The scrollpane
static JPanel pnlCalendar;
static int realYear, realMonth, realDay, currentYear, currentMonth;
public static void main(String args[]) {
// Look and feel
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (UnsupportedLookAndFeelException e) {
}
// Prepare frame
frmMain = new JFrame("Resource System"); // Create frame
frmMain.setSize(360, 375); // Set size to 400x400 pixels
pane = frmMain.getContentPane(); // Get content pane
pane.setLayout(null); // Apply null layout
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Close when X
// is clicked
// Create controls
lblMonth = new JLabel("January");
lblYear = new JLabel("Change year:");
cmbYear = new JComboBox();
btnPrev = new JButton("<<");
btnNext = new JButton(">>");
mtblCalendar = new DefaultTableModel() {
public boolean isCellEditable(int rowIndex, int mColIndex) {
return true;
}
};
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
pane.add(pnlCalendar);
pnlCalendar.add(lblMonth);
pnlCalendar.add(lblYear);
pnlCalendar.add(cmbYear);
pnlCalendar.add(btnPrev);
pnlCalendar.add(btnNext);
pnlCalendar.add(stblCalendar);
// Set bounds
pnlCalendar.setBounds(0, 0, 320, 335);
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25,
100, 25);
lblYear.setBounds(10, 305, 80, 20);
cmbYear.setBounds(230, 305, 80, 20);
btnPrev.setBounds(10, 25, 50, 25);
btnNext.setBounds(260, 25, 50, 25);
stblCalendar.setBounds(10, 50, 300, 250);
// Make frame visible
frmMain.setResizable(false);
frmMain.setVisible(true);
// 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 - 100; i <= realYear + 100; i++) {
cmbYear.addItem(String.valueOf(i));
}
// Refresh calendar
refreshCalendar(realMonth, realYear); // Refresh calendar
}
public static void refreshCalendar(int month, int year) {
// Variables
String[] months = { "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November",
"December" };
int nod, som; // Number Of Days, Start Of Month
// Allow/disallow buttons
btnPrev.setEnabled(true);
btnNext.setEnabled(true);
if (month == 0 && year <= realYear - 10) {
btnPrev.setEnabled(false);
} // Too early
if (month == 11 && year >= realYear + 100) {
btnNext.setEnabled(false);
} // Too late
lblMonth.setText(months[month]); // Refresh the month label (at the top)
lblMonth.setBounds(160 - lblMonth.getPreferredSize().width / 2, 25,
180, 25); // Re-align label with calendar
cmbYear.setSelectedItem(String.valueOf(year)); // Select the correct
// year in the combo box
// Clear table
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
mtblCalendar.setValueAt(null, i, j);
}
}
// Get first day of month and number of days
GregorianCalendar cal = new GregorianCalendar(year, month, 1);
nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
som = cal.get(GregorianCalendar.DAY_OF_WEEK);
// Draw calendar
for (int i = 1; i <= nod; i++) {
int row = new Integer((i + som - 2) / 7);
int column = (i + som - 2) % 7;
mtblCalendar.setValueAt(i, row, column);
}
// Apply renderers
tblCalendar.setDefaultRenderer(tblCalendar.getColumnClass(0),
new tblCalendarRenderer());
}
static class tblCalendarRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean selected, boolean focused, int row,
int column) {
super.getTableCellRendererComponent(table, value, selected,
focused, row, column);
if (column == 0 || column == 6) { // Week-end
setBackground(new Color(255, 220, 220));
} else { // Week
setBackground(new Color(255, 255, 255));
}
if (value != null) {
if (Integer.parseInt(value.toString()) == realDay
&& currentMonth == realMonth && currentYear == realYear) { // Today
setBackground(new Color(220, 220, 255));
}
}
setBorder(null);
setForeground(Color.black);
return this;
}
}
static class btnPrev_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 0) { // Back one year
currentMonth = 11;
currentYear -= 1;
} else { // Back one month
currentMonth -= 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
static class btnNext_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (currentMonth == 11) { // Foward one year
currentMonth = 0;
currentYear += 1;
} else { // Foward one month
currentMonth += 1;
}
refreshCalendar(currentMonth, currentYear);
}
}
static class cmbYear_Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (cmbYear.getSelectedItem() != null) {
String b = cmbYear.getSelectedItem().toString();
currentYear = Integer.parseInt(b);
refreshCalendar(currentMonth, currentYear);
}
}
}
}
Any ideas would help greatly. Basically the idea here is to have a standalone calendar that one can add events to and change events already listed. And I understand that swing isn't the most piratical solution.
I'm currently working on a project where I have to inser a Jtable(which is a calendar) into a Jpanel.
The problem is that i cant find a way to make it work in the panel(it doesn't even appear).
In part is because I dont have an object to fill the table and that's where I need help because I cant find a way to make it work.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
class Calendar{
int month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);;
JLabel l = new JLabel("", JLabel.CENTER);
String day = "";
JTable d;
JButton[] button = new JButton[49];
public Calendar() {
String[] header = { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" };
d = new JTable(header, 0);
DefaultTableModel calModel = new DefaultTableModel();
d.setBounds(20, 200, 500, 350);
for (int x = 0; x < button.length; x++) {
final int selection = x;
button[x] = new JButton();
button[x].setFocusPainted(false);
button[x].setBackground(Color.white);
if (x > 6)
button[x].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
day = button[selection].getActionCommand();
}
});
if (x < 7) {
button[x].setText(header[x]);
button[x].setForeground(Color.red);
}
d.add(button[x]);
}
JButton previous = new JButton("<< Previous");
previous.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
month--;
displayDate();
}
});
JButton next = new JButton("Next >>");
next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
month++;
displayDate();
}
});
displayDate();
}
public void displayDate() {
for (int x = 7; x < button.length; x++)
button[x].setText("");
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
"MMMM yyyy");
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, 1);
int dayOfWeek = cal.get(java.util.Calendar.DAY_OF_WEEK);
int daysInMonth = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
for (int x = 6 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++)
button[x].setText("" + day);
l.setText(sdf.format(cal.getTime()));
}
}
Can someone please help me?
// I am creating customize jcalender in swing
//I am facing problem regarding dates set
//i.e actual month is start from tuesday and it is starting from wednesday
// I am finding problem regarding setting values in calender-model
//Above code is running fine but problem in showing actual dates
//please suggest me to make necessary changes
import java.awt.Color;
public class Calendar extends JFrame {
private JPanel contentPane;
String[] years = { "2008", "2009", "2010" ,"2011","2012","2013","2014"};
JComboBox comboBox = new JComboBox(years);
String[] months = { "January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December" };
JList list = new JList(months);
JScrollPane scrollPane = new JScrollPane(list);
CalendarModel model = new CalendarModel();
JTable table = new JTable(model);
public Calendar() {
super();
getContentPane().setLayout(null);
comboBox.setBounds(10, 10, 100, 30);
comboBox.setSelectedIndex(5);
comboBox.addItemListener(new ComboHandler());
scrollPane.setBounds(200, 10, 150, 100);
list.setSelectedIndex(10);
list.addListSelectionListener(new ListHandler());
table.setBounds(10, 150, 550, 200);
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
getContentPane().add(comboBox);
getContentPane().add(scrollPane);
table.setGridColor(Color.black);
table.setShowGrid(true);
getContentPane().add(table);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(530,300);
setVisible(true);
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Calendar frame = new Calendar();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public class ComboHandler implements ItemListener {
public void itemStateChanged(ItemEvent e) {
System.out.println("ItemState change Method called ");
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}
}
public class ListHandler implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}
}
}
class CalendarModel extends AbstractTableModel {
String[] days = { "Sun" , "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
int[] numDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
String[][] calendar = new String[7][7];
public CalendarModel() {
//setting name of days (mon,tues)
for (int i = 0; i < days.length; ++i)
{
System.out.println("day[i] *** "+days[i]);
calendar[0][i] = days[i];
}
for (int i = 1; i < 7; ++i){
for (int j = 0; j < 7; ++j)
{
System.out.println("calendar[i][j] value i ** "+i +" j value "+ j );
calendar[i][j] = " ";
}
}
}
public int getRowCount() {
return 7;
}
public int getColumnCount() {
return 7;
}
public Object getValueAt(int row, int column) {
System.out.println("get Value at ** "+calendar[row][column]);
return calendar[row][column];
}
/*
public void setValueAt(Object value, int row, int column) {
System.out.println("set Value at ** "+(String) value);
calendar[row][column] = (String) value;
}*/
public void setMonth(int year, int month) {
for (int i = 1; i < 7; ++i)
{
for (int j = 0; j < 7; ++j)
{
calendar[i][j] = " ";
}
}
java.util.GregorianCalendar cal = new java.util.GregorianCalendar();
cal.set(year, month, 1);
int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK) - 1;
offset += 7;
int num = daysInMonth(year, month);
for (int i = 0; i < num; ++i) {
System.out.println("offset *** "+Integer.toString(i+1));
calendar[offset / 7][offset % 7] = Integer.toString(i+1);
++offset;
}
}
public boolean isLeapYear(int year) {
System.out.println("Is Leap Year *** ");
if (year % 4 == 0)
return true;
return false;
}
public int daysInMonth(int year, int month) {
System.out.println("day In month*** ");
int days = numDays[month];
if (month == 1 && isLeapYear(year))
++days;
System.out.println("days *** "+days);
return days;
}
}
I don't know if these are related but...
public void itemStateChanged(ItemEvent e) {
int index = comboBox.getSelectedIndex();
System.out.println("index = " + index + "; " + (index + 1998));
model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex());
table.repaint();
}
Doesn't produce results which match those that are listed within the combo box. For example, if you select the first value, it will equal 1998, not 2008
So, if I select 2013 from the combo box, I'm actually getting 2003.
When I changed it to
public void itemStateChanged(ItemEvent e) {
int index = comboBox.getSelectedIndex();
System.out.println("index = " + index + "; " + (index + 2008));
model.setMonth(comboBox.getSelectedIndex() + 2008, list.getSelectedIndex());
table.repaint();
}
It gave me better results.
I also changed
java.util.GregorianCalendar cal = new java.util.GregorianCalendar();
to
java.util.Calendar cal = java.util.Calendar.getInstance();
You should avoid making assumptions about the users calendar system if possible...
I'd also avoid null layouts as well ;)
You should also avoid calling table.repaint when you change the table model, instead try using fireTableDataChanged from within the setMonth method
I would, personally, add the listeners to the combobox and JList before setting there selected indexes, this will allow the listeners to update the model for you...
You'll also need to fix you ListHandler so that it uses 2008 instead 1998
Have a try with this in setMonth method
public void setMonth(int year, int month)
Change
calendar[offset / 7][offset % 7] = Integer.toString(i+1);
To
calendar[offset / 7][offset % 7] = Integer.toString(i+2);
try this.. use - 2 instead of - 1 in offset calculation.
java.util.GregorianCalendar cal = new java.util.GregorianCalendar();
cal.set(year, month, 1);
int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK)- 2 ;
offset += 7;
int num = daysInMonth(year, month);
for (int i = 0; i < num; ++i) {
System.out.println("offset *** "+Integer.toString(i+1));
calendar[offset / 7][offset % 7] = Integer.toString(i+1);
++offset;