I have a problem and it has been bugging me a long time now...
I have a JPanel with gridlayout(6,7) and my problem is updating the data correctly. I'm making a simple calendar software and of course I'm using Calendar. The problem is when I change Calendar object MONTH field and getting new month data to this JPanel gridlayout but the data isn't correctly showed.
Am I calculating my data fields incorreclty or how should I update the MONTH field. I have tryed set(int,int,int),add(CalendarObject.MONTH,+/-1),roll(CalendarObject.MONTH,true/false).
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cal.set(cal.YEAR,cal.MONTH-1,1);
cal.add(Calendar.DATE, -cal.get(Calendar.DAY_OF_WEEK));
Component[] comps = JavaCalendar.panel.getComponents();
for (Component comp : comps) {
JPanel p = (JPanel) comp;
JLabel c = (JLabel) p.getComponent(0);
c.setText(day.format(cal.getTime()));
cal.add(Calendar.DATE, +1);
}
}
});
Is it because for loop goes around 42 times and it updates every field and calls add() everytime...? The data updates little bit incorrect... Example May 1st is Wensday and June 1st is Saturday, but when this actionPerfomed() is called it shows June 1st is Sunday.
SSCE code
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class JavaCalendar extends JFrame {
private Calendar cal;
public static JPanel paneeli;
public static SimpleDateFormat month = new SimpleDateFormat("M");
private SimpleDateFormat year = new SimpleDateFormat("y");
private SimpleDateFormat day = new SimpleDateFormat("d");
private SimpleDateFormat Day = new SimpleDateFormat("E");
public JavaCalendar() {
super("JavaCalendar");
cal = Calendar.getInstance(Locale.getDefault());
cal.setFirstDayOfWeek(Calendar.MONDAY);
setSize(500,400);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new GridLayout(2,1));
paneeli = paneeli(cal);
add(paneeli);
add(buttons(cal));
setLocationRelativeTo(null);
setVisible(true);
}
public JPanel paneeli(Calendar cal) {
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DATE, -cal.get(Calendar.DAY_OF_WEEK)+2);
JPanel paneeli = new JPanel();
paneeli.setLayout(new GridLayout(6,7));
for(int i = 0;i<6;++i) {
for(int j = 0;j<7;++j) {
JPanel label = new JPanel();
label.setBackground(Color.RED);
if (i == 0) {
if (j == 0) {
// Top left corner, draw all sides
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
} else {
// Top edge, draw all sides except left edge
label.setBorder(BorderFactory.createMatteBorder(1,
0,
1,
1,
Color.BLACK));
}
} else {
if (j == 0) {
// Left-hand edge, draw all sides except top
label.setBorder(BorderFactory.createMatteBorder(0,
1,
1,
1,
Color.BLACK));
} else {
// Neither top edge nor left edge, skip both top and left lines
label.setBorder(BorderFactory.createMatteBorder(0,
0,
1,
1,
Color.BLACK));
}
}
label.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JPanel panel = (JPanel) e.getSource();
if (Color.RED.equals(panel.getBackground())) {
panel.setBackground(Color.PINK);
panel.revalidate();
panel.repaint();
}else{
panel.setBackground(Color.RED);
panel.revalidate();
panel.repaint();
}
}
});
JLabel labeli = new JLabel();
labeli.setText(day.format(cal.getTime()));
label.add(labeli);
cal.add(Calendar.DATE, +1);
paneeli.add(label);
}
}
return paneeli;
}
public JPanel buttons(Calendar cal) {
final Calendar calender = (Calendar) cal.clone();
JPanel buttonPanel = new JPanel();
JButton button = new JButton();
JButton buttoni = new JButton();
button.setText("Prev");
buttonPanel.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
calender.set(calender.YEAR,calender.MONTH-1,1);
calender.add(Calendar.DATE, -calender.get(Calendar.DAY_OF_WEEK));
Component[] comps = JavaCalendar.paneeli.getComponents();
for (Component comp : comps) {
JPanel p = (JPanel) comp;
JLabel c = (JLabel) p.getComponent(0);
c.setText(day.format(calender.getTime()));
calender.add(Calendar.DATE, +1);
}
}
});
buttoni.setText("Next");
buttonPanel.add(buttoni);
buttoni.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
calender.set(calender.YEAR,calender.MONTH+1,1);
calender.add(Calendar.DATE, -calender.get(Calendar.DAY_OF_WEEK));
Component[] comps = JavaCalendar.paneeli.getComponents();
for (Component comp : comps) {
JPanel p = (JPanel) comp;
JLabel c = (JLabel) p.getComponent(0);
c.setText(day.format(calender.getTime()));
calender.add(Calendar.DATE, +1);
}
}
});
cal = (Calendar) calender.clone();
return buttonPanel;
}
public static void main(String[] args) {
new JavaCalendar();
}
}