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.
Related
I have a problem and I can't get past it...
I am writing a program in Java using swing. That program will be used to to chose a day from a displayed calendar and put an hours of Your work (e.g 8:00 - 16:00) then the program will calculate how many hours You have worked in month and will calculate Your salary.
I've written some code so when starting the program you see a representation of current month. I wanted to add an ActionListenerto a button which will rearrange look of calendar to previous month. I wanted to use the same method that generates the current month but sending a different argument (previous month date).
To test it I used that method on the ActionListener (so when I start it I see blank form and after pressing that button it will show me the current method) and the problem is that nothing at all is happening... That method works fine when I put it in the constructor of my class but doesn't work when it is used as action performed and I don't know why.
I hope You will help me to figure it out and maybe tell me where I made a mistake and what I can do about it. This is a hobby for me I don't have any professional experience in programming.
My code:
package zadanie;
import javax.swing.*;
import java.awt.*;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
class Panel extends JPanel {
private JButton[] buttonArray = new JButton[42];
private JButton nextButton, previousButton;
private JLabel monthYear;
private Color buttonColor = new Color(116, 185, 255);
private Color buttonColorInactive = new Color(255,255,255);
private Color sundey = new Color(0, 184, 148);
private Color saturday = new Color(85, 239, 196);
private Color labelColor = new Color(255, 211, 42);
private LocalDate dateNow = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
Panel(){
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(getMonthLabel());
add(getWeekDaysPanel());
add(Box.createRigidArea(new Dimension(0,5)));
add(getMonthPanel());
calendarGenerator();
getWeekDaysPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
getMonthPanel().setAlignmentX(Component.CENTER_ALIGNMENT);
}
private JComponent getMonthPanel(){
JPanel monthPanel = new JPanel();
monthPanel.setLayout(new GridLayout(6,7));
monthPanel.setMaximumSize(new Dimension(710,460));
monthPanel.setPreferredSize(new Dimension(710,460));
monthPanel.setMaximumSize(new Dimension(710,460));
//Loop that in every iteration creates a "b" button set it properties and to a "p" panel and a buttonArray.
for (int i=0; i<42; i++){
JButton b = new JButton();
b.setMaximumSize(new Dimension(95,70));
b.setPreferredSize(new Dimension(95,70));
b.setMaximumSize(new Dimension(95,70));
b.setBorderPainted(false);
b.setRolloverEnabled(false);
b.setVisible(true);
JPanel p = new JPanel();
p.add(b);
buttonArray[i] = b;
monthPanel.add(p);
}
return monthPanel;
}
// Similar to getMonthPanel method - it adds a 7 labels with the names of the days
private JComponent getWeekDaysPanel(){
JPanel daysPanel = new JPanel();
daysPanel.setBackground(labelColor);
daysPanel.setMinimumSize(new Dimension(700,35));
daysPanel.setPreferredSize(new Dimension(700,35));
daysPanel.setMaximumSize(new Dimension(700,35));
String[] daysList = {"pn.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz."};
for (int i = 0; i < 7; i++){
JLabel e = new JLabel("", JLabel.CENTER);
e.setMinimumSize(new Dimension(95,25));
e.setPreferredSize(new Dimension(95,25));
e.setMaximumSize(new Dimension(95,25));
e.setLayout(new GridLayout(1,7));
e.setText(daysList[i]);
daysPanel.add(e);
}
return daysPanel;
}
// a method that adds a two buttons (to switch to previous and next month) and a label that displays the displayed month and year
private JComponent getMonthLabel(){
JPanel monthLabel = new JPanel();
monthLabel.setMinimumSize(new Dimension(700,45));
monthLabel.setPreferredSize(new Dimension(700,45));
monthLabel.setMaximumSize(new Dimension(700,45));
monthLabel.setBackground(buttonColorInactive);
monthLabel.revalidate();
nextButton = new JButton();
ImageIcon nIcon = new ImageIcon("n.png");
nextButton.setMinimumSize(new Dimension(25,25));
nextButton.setPreferredSize(new Dimension(25,25));
nextButton.setMaximumSize(new Dimension(25,25));
nextButton.setIcon(nIcon);
nextButton.setBorderPainted(false);
nextButton.setBackground(new Color(255,255,255));
// nextButton.addActionListener();
previousButton = new JButton();
ImageIcon pIcon = new ImageIcon("p.png");
previousButton.setMinimumSize(new Dimension(25,25));
previousButton.setPreferredSize(new Dimension(25,25));
previousButton.setMaximumSize(new Dimension(25,25));
previousButton.setIcon(pIcon);
previousButton.setBorderPainted(false);
previousButton.setBackground(new Color(255,255,255));
monthYear = new JLabel("MIESIĄC_ROK", JLabel.CENTER);
monthYear.setMinimumSize(new Dimension(620,25));
monthYear.setPreferredSize(new Dimension(620,25));
monthYear.setMaximumSize(new Dimension(620,25));
monthLabel.add(previousButton);
monthLabel.add(monthYear);
monthLabel.add(nextButton);
return monthLabel;
}
// A method that change the appearance of the buttons in the "buttonArray" so the whole thing looks like calendar of the month
private void calendarGenerator(){
int noOfDays = dateNow.lengthOfMonth(); /// getting number of days in a month
int firstDayIndex = (dateNow.getDayOfWeek().getValue() - 1); // gettin the value (number) of the first day of month (it is decreased because getValue starts with 1 and buttonArray with 0)
int dayNo = 1; // variable that is used to set number of day in the setText() method of button
int month = (dateNow.getMonth().getValue() - 1); // variable that has a number of the previous month, that is why I decreased it by 1
int year = dateNow.getYear(); // getting current year
if (month == 0){ // safety - when the month variable hits 0 it is set for December (no 12) and year is decreased by 1
month = 12;
year --;
}
LocalDate previousMonthDate = LocalDate.of(year, month, 1); // a new variable for the previous month
int dayNo2 = previousMonthDate.lengthOfMonth() - (firstDayIndex - 1); // getting number of days of the previous mont (similar to dayNo but it responsible for the previous month during displaying
for (int i = 0; i < firstDayIndex; i++){ // loop that fill days in buttons that represent previous month
buttonArray[i].setText(""+dayNo2);
buttonArray[i].setVisible(true);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo2++;
}
for (int i = firstDayIndex; i < noOfDays + firstDayIndex; i++){ // loop that fill days in buttons that represent current month
buttonArray[i].setText(""+dayNo);
buttonArray[i].setVisible(true);
if (i == 6 || i == 13 || i == 20 || i == 27 || i == 34 || i == 41){
buttonArray[i].setBackground(sundey);
}
else if (i == 5 || i == 12 || i == 19 || i == 26 || i == 33 || i == 40){
buttonArray[i].setBackground(saturday);
}
else{
buttonArray[i].setBackground(buttonColor);
}
monthYear.setText(""+translate(dateNow.getMonth().getValue())+" "+year); // "translate()" method is used for translating month names from English to my native language
dayNo++;
}
dayNo = 1; // setting dayNo 1 because next month always starts with 1
for (int i = (noOfDays + firstDayIndex); i < 42; i++){ // loop that fills the rest, empty buttons that represent next month
buttonArray[i].setText(""+ dayNo);
buttonArray[i].setVisible(true);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo++;
}
}
// Method for translating English names to my native Language
private String translate(int a){
String monthInPolish = "";
switch (dateNow.getMonth()){
case JANUARY: monthInPolish = "Styczeń"; break;
case FEBRUARY: monthInPolish = "Luty"; break;
case MARCH: monthInPolish = "Marzec"; break;
case APRIL: monthInPolish = "Kwiecień"; break;
case MAY: monthInPolish = "Maj"; break;
case JUNE: monthInPolish = "Czerwiec"; break;
case JULY: monthInPolish = "Lipiec"; break;
case AUGUST: monthInPolish = "Sierpień"; break;
case SEPTEMBER: monthInPolish = "Wrzesień"; break;
case OCTOBER: monthInPolish = "Październik"; break;
case NOVEMBER: monthInPolish = "Listopad"; break;
case DECEMBER: monthInPolish = "Grudzień"; break;
}
return monthInPolish;
}
}
The method that I'm talking about is called calendarGenerator()
Thanks for the effort!
This is how it looks when I use that method in the constructor
This is how it looks when I not use that method in the constructor
Edit: I've added pictures of how it looks when I use calendarGenerator() method in constructor and when that method is not used. Using that method in that form (as showed above) when the button is pressed, I wanted to see if my approach is correct (I know that I can send arguments and thus use it to switch months). So I removed the calendarGenerator() method from constructor (the second picture shows how the program looks like without it) and put it to ActionPerformed method for the button (that black arrow). I thought that when I press the button the window will change the look so it will look like on the first picture but only text on the label above is changing nothing else and I still don't know why.
Change calendarGenerator so it accepts an argument which is an arbitrary date in the month you want to generate:
private void calendarGenerator(LocalDate dateInMonth){
int noOfDays = dateInMonth.lengthOfMonth(); /// getting number of days in a month
.........
}
To generate the current month call it by calendarGenerator(dateNow);
To generate next month: calendarGenerator(dateNow.plusMonths(1));
The following is an mre(1) demonstrating how to use the modified method:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class Panel extends JPanel {
private JPanel monthPanel;
private JLabel monthYear;
private final static Color buttonColor = new Color(116, 185, 255), buttonColorInactive = new Color(255,255,255),
sundey = new Color(0, 184, 148), saturday = new Color(85, 239, 196), labelColor = new Color(255, 211, 42);
private final static int DAYS=7, WEEKS =6;
private final LocalDate dateNow = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
private LocalDate calendarDate;
private final JButton[] buttonArray = new JButton[DAYS*WEEKS];
Panel(){
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(getMonthLabel());
add(getWeekDaysPanel());
add(Box.createRigidArea(new Dimension(0,5)));
makeMonthPanel();
add(monthPanel);
calendarGenerator(dateNow);
}
private void makeMonthPanel(){
monthPanel = new JPanel();
monthPanel.setLayout(new GridLayout(WEEKS,DAYS));
monthPanel.setPreferredSize(new Dimension(710,460));
monthPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
//Loop that in every iteration creates a "b" button set it properties and to a "p" panel and a buttonArray.
for (int i=0; i< DAYS * WEEKS; i++){
JButton b = new JButton();
b.setPreferredSize(new Dimension(95,70));
b.setBorderPainted(false);
b.setRolloverEnabled(false);
JPanel p = new JPanel();
p.add(b);
buttonArray[i] = b;
monthPanel.add(p);
}
}
// Similar to getMonthPanel method - it adds a 7 labels with the names of the days
private JComponent getWeekDaysPanel(){
JPanel daysPanel = new JPanel();
daysPanel.setBackground(labelColor);
daysPanel.setPreferredSize(new Dimension(700,35));
String[] daysList = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
for (int i = 0; i < daysList.length ; i++){
JLabel e = new JLabel("", JLabel.CENTER);
e.setPreferredSize(new Dimension(95,25));
e.setText(daysList[i]);
daysPanel.add(e);
}
return daysPanel;
}
// a method that adds a two buttons (to switch to previous and next month) and a label that displays the displayed month and year
private JComponent getMonthLabel(){
JPanel monthLabel = new JPanel();
monthLabel.setBackground(buttonColorInactive);
JButton nextButton = new JButton(">");;
nextButton.setBorderPainted(false);
nextButton.setBackground(new Color(255,255,255));
nextButton.addActionListener(e -> calendarGenerator(calendarDate.plusMonths(1)));
JButton previousButton = new JButton("<");
previousButton.setBorderPainted(false);
previousButton.setBackground(new Color(255,255,255));
previousButton.addActionListener(e -> calendarGenerator(calendarDate.minusMonths(1)));
monthYear = new JLabel("MIESIĄC_ROK", JLabel.CENTER);
monthYear.setPreferredSize(new Dimension(620,25));
monthLabel.add(previousButton);
monthLabel.add(monthYear);
monthLabel.add(nextButton);
return monthLabel;
}
// A method that change the appearance of the buttons in the "buttonArray" so the whole thing looks like calendar of the month
private void calendarGenerator(LocalDate dateInMonth){
calendarDate = dateInMonth;
int noOfDays = dateInMonth.lengthOfMonth(); /// getting number of days in a month
int firstDayIndex = dateInMonth.getDayOfWeek().getValue() - 1; // gettin the value (number) of the first day of month (it is decreased because getValue starts with 1 and buttonArray with 0)
int dayNo = 1; // variable that is used to set number of day in the setText() method of button
int month = dateInMonth.getMonth().getValue() - 1; // variable that has a number of the previous month, that is why I decreased it by 1
int year = dateInMonth.getYear(); // getting current year
if (month == 0){ // safety - when the month variable hits 0 it is set for December (no 12) and year is decreased by 1
month = 12;
year --;
}
LocalDate previousMonthDate = LocalDate.of(year, month, 1); // a new variable for the previous month
int dayNo2 = previousMonthDate.lengthOfMonth() - (firstDayIndex - 1); // getting number of days of the previous mont (similar to dayNo but it responsible for the previous month during displaying
for (int i = 0; i < firstDayIndex; i++){ // loop that fill days in buttons that represent previous month
buttonArray[i].setText(""+dayNo2);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo2++;
}
for (int i = firstDayIndex; i < noOfDays + firstDayIndex; i++){ // loop that fill days in buttons that represent current month
buttonArray[i].setText(""+dayNo);
buttonArray[i].setVisible(true);
if (i == 6 || i == 13 || i == 20 || i == 27 || i == 34 || i == 41){
buttonArray[i].setBackground(sundey);
}
else if (i == 5 || i == 12 || i == 19 || i == 26 || i == 33 || i == 40){
buttonArray[i].setBackground(saturday);
}
else{
buttonArray[i].setBackground(buttonColor);
}
monthYear.setText(""+dateInMonth.getMonth()+" "+year);
dayNo++;
}
dayNo = 1; // setting dayNo 1 because next month always starts with 1
for (int i = noOfDays + firstDayIndex; i < 42; i++){ // loop that fills the rest, empty buttons that represent next month
buttonArray[i].setText(""+ dayNo);
buttonArray[i].setVisible(true);
buttonArray[i].setEnabled(false);
buttonArray[i].setBackground(buttonColorInactive);
dayNo++;
}
monthPanel.revalidate();
}
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel calendarPane = new Panel();
frame.getContentPane().add(calendarPane);
frame.pack();
frame.setVisible(true);
}
}
(1) Please consider mre when posting questions and answers. To achieve it remove every thing that is not essential (like translation in this case) to show the problem. mre should demonstrate the problem and not necessarily your application.
I have a datepicker program, which allows me to choose date. I want to highlight the current date in the current month and current year only. All others not to be highlighted. I have buttons on which I display the dates in a month. I am able to highlight the current date in the current month and current year, but the same cell is highlighted in all the months in all years. How can I avoid this?
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import java.awt.Component;
import java.awt.event.*;
import java.awt.*;
import java.awt.Toolkit;
import java.awt.Component.*;
import java.awt.Graphics;
import java.awt.Cursor.*;
import java.text.*;
public class DatePicker
{
int month = Calendar.getInstance().get(Calendar.MONTH);
int year = Calendar.getInstance().get(Calendar.YEAR);
JLabel l = new JLabel("", JLabel.CENTER);
String day = "";
JDialog d;
JButton[] button = new JButton[49];
public DatePicker(JFrame parent)
{
d = new JDialog();
d.setModal(true);
String[] header = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"};
JPanel p1 = new JPanel(new GridLayout(7, 7));
p1.setPreferredSize(new Dimension(430, 120));
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();
d.dispose();
}
});
if(x < 7)
{
button[x].setText(header[x]);
button[x].setForeground(Color.red);
}
p1.add(button[x]);
}
JPanel p2 = new JPanel(new GridLayout(1, 3));
JButton previous = new JButton("<< Previous");
previous.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
month--;
displayDate();
}
});
p2.add(previous);
p2.add(l);
JButton next = new JButton("Next >>");
next.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
month++;
displayDate();
}
});
p2.add(next);
d.add(p1, BorderLayout.CENTER);
d.add(p2, BorderLayout.SOUTH);
d.pack();
d.setLocationRelativeTo(parent);
displayDate();
d.setVisible(true);
}
public void displayDate()
{
for(int x = 7; x < button.length; x++)
button[x].setText("");
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("MMMM yyyy");
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
Font font = new Font("Courier", Font.BOLD, 12);
Calendar curr = new GregorianCalendar();
int currdate = curr.get(Calendar.DAY_OF_MONTH);
int currmon = curr.get(Calendar.MONTH);
int curryear = curr.get(Calendar.YEAR);
int date = cal.get(Calendar.DAY_OF_MONTH);
int mon = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
int day1 = cal.get(Calendar.DAY_OF_WEEK);
int start = (7 - (date - day1) % 7) % 7;
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("currdate : " + currdate);
System.out.println("currmon : " + currmon);
System.out.println("mon : " + mon);
System.out.println("curryear : " + curryear);
System.out.println("year : " + year);
for(int x = 6 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++)
{
button[x].setText("" + day);
System.out.println("x : " + x);
System.out.println("day : " + day);
if(currdate == (x - 12) && currmon == mon && curryear == year)
{
// button[x].setFont(font);
button[day].setBackground(Color.GREEN);
}
else
button[x].setBackground(Color.white);
}
// for(int i = 1; i <= days; i++)
l.setText(sdf.format(cal.getTime()));
d.setTitle("Date Picker");
}
public String setPickedDate()
{
if(day.equals(""))
return day;
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("MM-dd-yyyy");
Calendar cal = Calendar.getInstance();
cal.set(year, month, Integer.parseInt(day));
return sdf.format(cal.getTime());
}
}
update my post
You are missing else block:
if(currdate == (x - 12) && currmon == mon && curryear == year) {
button[x].setFont(font);
button[x].setBackground(Color.GREEN);
} else {
button[x].setFont(?); //<-- replace ? with desired font
button[x].setBackground(?); //<-- replace ? with desired color
}
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'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);
}
}
}
}