Datas

Estava tentando fazer uma classe para gerar um calendário tipo akele que tem no windows qdo vc clica 2x no relógio.

Acontece q estou com um problema qdo o dia da semana que inicia o mês é Domingo ou Sábado.

Se o mês deve iniciar no domingo, ele pula e começa na segunda.
Se deve começar no sábado ele tipo acrescenta mais uma coluna no grid, ficando 8 colunas e ñ exibe a qtda de nº de dias correto.

Pra testar o programa, só mudem o mês no relógio do windows para verem os erros.

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class CData extends JFrame {
	private Calendar cal = Calendar.getInstance();
	private Calendar oldCal = Calendar.getInstance();
	private int mesAntes;;
	private int oldSemana;
	private int cont = 1;
	private JLabel[] lblDatas = new JLabel[38];
	private JLabel[] lblTopo = new JLabel[7];
	private Container painel;
	private JPanel pnMain, pnTopo;
	private String[] topo = {"D", "S", "T", "Q", "Q", "S", "S"};

	public CopyOfData() {
		super("Calendário");

		//Verifica se o mês atual é janeiro, e se for a variávei mesAntes vai ser igual a Dezembro(11)
		mesAntes = cal.get(Calendar.MONTH) - 1;
		if (mesAntes < 0) {
			mesAntes = 11;
		}

		painel = getContentPane();
		painel.setLayout(new BorderLayout());

		pnMain = new JPanel();
		pnMain.setLayout(new GridLayout(5, 7));

		pnTopo = new JPanel();
		pnTopo.setLayout(new GridLayout(1, 7));

		for (int i = 0; i < lblDatas.length; i++) {
			lblDatas[i] = new JLabel("");
		}

		//Acha o dia da semana correspondente ao último dia do mês anterior
		oldCal.set(Calendar.MONTH, mesAntes);
		oldCal.set(Calendar.DAY_OF_MONTH, oldCal.getActualMaximum(Calendar.DAY_OF_MONTH));
		oldSemana = oldCal.get(Calendar.DAY_OF_WEEK);

		if (oldSemana + 1 == 8) {
			for (int i = 0; i < cal.getActualMaximum(Calendar.DAY_OF_MONTH); i++, cont++) {
				pnMain.add(lblDatas[i]);
				lblDatas[i].setText(Integer.toString(cont));
			}
		} else {
			for (int i = 0; i < cal.getActualMaximum(Calendar.DAY_OF_MONTH) + oldSemana; i++) {
				if (i >= oldSemana) {
					pnMain.add(lblDatas[i]);
					lblDatas[i].setText(Integer.toString(cont));
					cont++;
				} else {
					pnMain.add(lblDatas[i]);
				}
			}
		}

		for (int i = 0; i < lblTopo.length; i++) {
			lblTopo[i] = new JLabel(topo[i]);
			pnTopo.add(lblTopo[i]);
		}

		painel.add(pnTopo, BorderLayout.NORTH);
		painel.add(pnMain, BorderLayout.CENTER);

		setSize(400, 300);
		setVisible(true);

	}

	public static void main(String args[]) {
		CData app = new CData();
		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
 import javax.swing.*;
 import java.awt.*;
 import java.util.*;
 
 public class CData extends JFrame {
 	private Calendar cal = Calendar.getInstance();
 	private JLabel[] lblDatas = new JLabel[38];
 	private JLabel[] lblTopo = new JLabel[7];
 	private Container painel;
 	private JPanel pnMain, pnTopo;
 	private String[] topo = {"D", "S", "T", "Q", "Q", "S", "S"};
 
 	public CData() {
 		super("Calendário");
 
 		painel = getContentPane();
 		painel.setLayout(new BorderLayout());
 
 		pnMain = new JPanel();
 		pnMain.setLayout(new GridLayout(5, 7));
 
 		pnTopo = new JPanel();
 		pnTopo.setLayout(new GridLayout(1, 7));
 
 		for (int i = 0; i < lblDatas.length; i++) {
 			lblDatas[i] = new JLabel("");
 		}
 
 
                // Qual é o dia da semana do dia primeiro DESTE mês?
                cal.setTime (new java.util.Date());
                cal.set (Calendar.DAY_OF_MONTH, 1);
                int diaPrimeiro = cal.get(Calendar.DAY_OF_WEEK);
                // Qual é o último dia deste mês?
                int ultimoDia = cal.getActualMaximum (Calendar.DAY_OF_MONTH);
                int pos = diaPrimeiro - Calendar.SUNDAY; // a partir de que JLabel lblDatas vamos contar de 1 a ultimoDia
                //-- Adicionando os labels vazios
                for (int i = 0; i < pos; ++i) {
                    pnMain.add(lblDatas[i]);
                }
                //-- Pondo os dias de 1 a ultimoDia
                for (int i = 1; i <= ultimoDia; ++i, ++pos) {
                    lblDatas[pos].setText (Integer.toString (i));
                    pnMain.add(lblDatas[pos]);
                }
 
                // Pondo os labels dos dias da semana
 		for (int i = 0; i < lblTopo.length; i++) {
 			lblTopo[i] = new JLabel(topo[i]);
 			pnTopo.add(lblTopo[i]);
 		}
 
 		painel.add(pnTopo, BorderLayout.NORTH);
 		painel.add(pnMain, BorderLayout.CENTER);
 
 		setSize(400, 300);
 		setVisible(true);
 
 	}
 
 	public static void main(String args[]) {
 		CData app = new CData();
 		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 }

Por que você precisava saber o mês anterior? Fiquei curioso.

ñ era necessário saber o último mês…poderia também ser feito como vc fez.

Mas o problema ainda continua…
Abril de 2006 por exemplo…ele adiciona mais uma coluna no layout…e ñ fica na posição correta

¿¿
Oq pode ser isso?

Agora deve estar funcionando. Quando estava almoçando me lembrei que um calendário pode ter até 6 linhas, como em abril de 2006.

import javax.swing.*;
  import java.awt.*;
  import java.util.*;
  
  public class CData extends JFrame {
  	private Calendar cal = Calendar.getInstance();
  	private JLabel[] lblDatas = new JLabel[6 * 7]; // Note que um calendário pode ter até 6 linhas.
  	private JLabel[] lblTopo = new JLabel[7];
  	private Container painel;
  	private JPanel pnMain, pnTopo;
  	private String[] topo = {"D", "S", "T", "Q", "Q", "S", "S"};
  
  	public CData() {
  		super("Calendário");
  
  		painel = getContentPane();
  		painel.setLayout(new BorderLayout());
  
  		pnMain = new JPanel();
  		pnMain.setLayout(new GridLayout(6, 7)); // linhas, colunas
  
  		pnTopo = new JPanel();
  		pnTopo.setLayout(new GridLayout(1, 7));
  
  		for (int i = 0; i < lblDatas.length; i++) {
  			lblDatas[i] = new JLabel("");
  			pnMain.add(lblDatas[i]);
  		}
                 // Qual é o dia da semana do dia primeiro DESTE mês?
                 cal.setTime (new java.util.Date());
                 cal.set (Calendar.DAY_OF_MONTH, 1);
                 int diaPrimeiro = cal.get(Calendar.DAY_OF_WEEK); // Calendar.SUNDAY ... Calendar.SATURDAY
                 // Qual é o último dia deste mês?
                 int ultimoDia = cal.getActualMaximum (Calendar.DAY_OF_MONTH);
                 int pos = diaPrimeiro - Calendar.SUNDAY; // a partir de que JLabel lblDatas vamos contar de 1 a ultimoDia
                 //-- Pondo os dias de 1 a ultimoDia
                 for (int i = 1; i <= ultimoDia; ++i, ++pos) {
                     lblDatas[pos].setText (Integer.toString (i));
                 }
  
                 // Pondo os labels dos dias da semana
  		for (int i = 0; i < lblTopo.length; i++) {
  			lblTopo[i] = new JLabel(topo[i]);
  			pnTopo.add(lblTopo[i]);
  		}
  
  		painel.add(pnTopo, BorderLayout.NORTH);
  		painel.add(pnMain, BorderLayout.CENTER);
  
  		setSize(400, 300);
  		setVisible(true);
  
  	}
  
  	public static void main(String args[]) {
  		CData app = new CData();
  		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  	}
  }

thingol…mto obrigado…entendi oq vc fez no código. vlw pela ajuda…

Agora…a primeira etapa tá pronta…

como eu faria pra poder incluir essa janela do calendário em uma outra janela principal??

Aí é com você. Normalmente a mágica envolve fazer sua classe herdar de JPanel (em vez de JFrame), e incluir esse JPanel na janela principal. Você deve ter de sobrepor mais alguns métodos, para poder retornar o tamanho sugerido do seu JPanel, por exemplo.

JPanel trata eventos de JLabels??