JLabel calendario

Eai pessoal, blz?

Queria saber como faz um calendario tipo igual do windows ?
na verdade vai ser assim: no label, tem as horas … ai, qdo o usuario clica nesse label, mostra o mês inteiro … alguem sabe como faz isso aew ?

vlw

bom não entendi direito sua duvida… se já fez o label com as horas? então agora é só por no action de mouse clik do label para abrir um outro painel que vai mostrar o mês e o ano.

Cria um label(com as horas) visível e um painel (com o calendário inteiro) invisível, e no evento de clique em cima do label, dá um setVisible(true) no painel.

blz ? … entendi o esquema … mas como faz o calendario inteiro ? e mais uma coisa: qual evento de clique em cima do label é utilizado ? o actionPerformed ?

Não sei já vem “implementado de fábrica”. Mas existem várias opções na net.

blz ? … entendi o esquema … mas como faz o calendario inteiro ? e mais uma coisa: qual evento de clique em cima do label é utilizado ? o actionPerformed ?[/quote]

Tem o evento onMouseClick().

Usa NetBeans?? Tem no designer dele…

O código vai ficar mais ou menos assim:


labelHoras.addMouseListener(new java.awt.event.MouseAdapter() {
                  public void mouseClicked(java.awt.event.MouseEvent evt) {
                        mostrarCalendario(evt);
                  }
            });

private void mostrarCalendario(MouseEvent evt){
            if (evt.getClickCount() == 2){ // No duplo clique
		  painelCalendario.setVisible(true);
	    }
}

blz ? … entendi o esquema … mas como faz o calendario inteiro ? e mais uma coisa: qual evento de clique em cima do label é utilizado ? o actionPerformed ?[/quote]

Tem o evento onMouseClick().

Usa NetBeans?? Tem no designer dele…[/quote]

nao uso netbeans nao … eclipse :wink:
mas onde esta esse evento onMouseClick() ?

Não mexo com Eclipse, então não sei direito… é o nome não é onMouseClick()… :oops:

Coloquei um código ali em cima, dá uma olhada… Assim tu adiciona a ação ao clique

blz ? … entendi o esquema … mas como faz o calendario inteiro ? e mais uma coisa: qual evento de clique em cima do label é utilizado ? o actionPerformed ?[/quote]

Tem o evento onMouseClick().

Usa NetBeans?? Tem no designer dele…

O código vai ficar mais ou menos assim:

[code]

labelHoras.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
mostrarCalendario(evt);
}
});

private void mostrarCalendario(MouseEvent evt){
if (evt.getClickCount() == 2){ // No duplo clique
painelCalendario.setVisible(true);
}
}

[/code][/quote]

vlw ae … vou dar uma olhada :wink:

Para montar o painel tu vai ter que usar bastante a classe java.util.Date e java.util.Calendar.

Cria um painel com GridLayout de 7 colunas, e vai adicuionando dias… acho que assim que eu faria…

[quote=thegoergen]Para montar o painel tu vai ter que usar bastante a classe java.util.Date e java.util.Calendar.

Cria um painel com GridLayout de 7 colunas, e vai adicuionando dias… acho que assim que eu faria…[/quote]

humm … vou tentar cara … qq coisa, do um toque aq :wink:

E ai pessoal blz ?
resolvi ressuscitar o topico … :slight_smile:

entao, eu nao to conseguindo fazer aparecer o calendario do mês atual no frame … nao tem como fazer igual ao relogio ? tipo, no relogio é so usar o date … no calendario nao tem como ?

Como assim. Não consegue colocar o painel no Frame??

Se puder colocar o código ajudaria.

abçs.

A idéia básica é pegar o mês, criando um Calendar novo, e ir passando com um FOR por todos os dias, colocando eles na coluna certa, do dia da semana…

Fica difícil saber o problema, tente explicar um pouco mais… E, se você já resolveu, poste a solução, ou ao menos diga que foi resolvido…

eu ja cooloquei o panel no frame … minha duvida eh a seguinte: como faço pra colocar o calendario no panel ?
ai esta o codigo

package calendario;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
   
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import calendario.Relogio.ClockRunnable;

public class Relogio {

	private static final long serialVersionUID = 1L;

	JPanel p1 = new JPanel();
	
    private JLabel lblHora, lblData;
    private JPanel pCal;
    int flag=0;
    
    // Formatador da hora
    private static final DateFormat FORMATO = new SimpleDateFormat("HH:mm:ss");
	
	public Relogio() {
		
        p1.setLayout(new FlowLayout());
        p1.add(getLblData());
        p1.add(getLblHora());
  
        // Inicia a thread do relógio.
        Thread clockThread = new Thread(new ClockRunnable(), "Clock thread");
        clockThread.setDaemon(true);
        clockThread.start();
		
	}
	
    private JLabel getLblHora() {
        if (lblHora == null) {
            lblHora = new JLabel();
            lblHora.addMouseListener(new java.awt.event.MouseAdapter() {
           	 public void mouseClicked(java.awt.event.MouseEvent evt) {
           		 if(flag == 0) {
           			 mostrarCalendario(evt);
           		 	 flag = 1;
           		 }
             }
          });
        }
        return lblHora;
    }
    
    private JLabel getLblData() {
        if (lblData == null) {
            lblData = new JLabel();
            SimpleDateFormat sdf;
            sdf = new SimpleDateFormat("EEEE', 'dd 'de' MMMM 'de' YYYY");
            String data = sdf.format(new Date());
            lblData.add(data);
            lblData.addMouseListener(new java.awt.event.MouseAdapter() {
           	 public void mouseClicked(java.awt.event.MouseEvent evt) {
           		 if(flag == 0) {
           			 mostrarCalendario(evt);
           		 	 flag = 1;
           		 }
             }
          });
        }
        return lblHora;
    }
    
    private void mostrarCalendario(MouseEvent evt) {
        if (evt.getClickCount() == 1){ // No unico clique
            final JFrame frame = new JFrame();
            pCal = new JPanel();

            frame.add(pCal);
       	 	
            frame.addWindowListener(
               	 new WindowListener() {
               			public void windowClosing(WindowEvent e) {
               				flag=0;
               				frame.dispose();
               			}
               			public void windowActivated(WindowEvent e) { }
               			public void windowClosed(WindowEvent e) { }
               			public void windowDeactivated(WindowEvent e) { }
               			public void windowDeiconified(WindowEvent e) { }
               			public void windowIconified(WindowEvent e) { }
               			public void windowOpened(WindowEvent e) { }
               	 }
            );
       	 	
       	 	frame.setSize(300, 300);
       	 	frame.setResizable(false);
       	 	frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    
    /**
     * Método para atualizar a hora no formulário. Não é thread-safe, portanto,
     * se o utilizado fora da thread da AWT, deve-se utilizar um dos comandos da
     * EventQueue (invokeLater ou invokeAndWait).
     */
    public void setHora(Date date) {
        getLblHora().setText(FORMATO.format(date));
    }
  
    /**
     * Runnable que contém o código que atuará na nossa thread. Basicamente, ele
     * chama o método setHora de segundo em segundo, passando a data atual.
     */
    public class ClockRunnable implements Runnable {
        public void run() {
            try {
                while (true) {
                    // Aqui chamamos o setHora através da EventQueue da AWT.
                    // Conforme dito, isso garante Thread safety para o Swing.
                    EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            // Só podemos chamar setHora diretamente dessa
                            // forma, pois esse Runnable é uma InnerClass não
                            // estática.
                            setHora(new Date());
                        }
                    });
                    // Fazemos nossa thread dormir por um segundo, liberando o
                    // processador para outras threads processarem.
                    Thread.sleep(1000);
                }
            }
            catch (InterruptedException e) {
            }
        }
    }
    
	public JPanel getLayout() {
		return p1;
	}
}

Ah… entendi…

Bem. Primeiramente, não faça a criação do JPanel e do JFrame no clique do botão. Imagine, ele irá refazer todo o JFrame a cada clique… crie antes, mostre apenas no clique.

Agora… Para criar o painel.

Trabalhe com uma matriz de JLabel, de 7 colunas… E neles você coloca os dias.

Depois, cria um painel com GridLayout também de 7 colunas (e acho que 6 linhas tá bom… não tenho certeza).

Para preencher o painel, crie um 2 FORs encadeados que colocam os labels da tua matriz no painel, na posição correta.

Acho que funciona… :slight_smile:

Vou fazer algo que eu não deveria fazer, mas devido às minhas dificuldades em passar pro português o que eu faço em java…

[code]
private static void mostraCalendario(){
JFrame jf = new JFrame(“Teste”);
jf.setSize(500,500);
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    // Aqui é a parte de começar a carregar o painel
    JLabel[][] days = carregaMatrizLabels();
    carregaDatas(days);
    JPanel daysGrid = carregaPainelDias(days);
    
    jf.getContentPane().add(daysGrid);
    
    jf.setVisible(true);
  }
  
/**
 * Carregar os labels passados em um painel...
 * @param days Os Labels para pôr no painel
 * @return O painel preenchido com os Labels
 */
  private static JPanel carregaPainelDias(final JLabel[][] days) {
    
    JPanel painelDias = new JPanel(new GridLayout(7, 7, 0, 0)); // Crio painel com o Layout
    
    for (int i = 0; i < 7; i++){
	  for (int j = 0; j < 7; j++){
		painelDias.add(days[i][j]); // Adiciono os labels...
	  }
    }
    
    return painelDias;
  }
  
/**
 * Crio uma matriz de labels vazios, sendo que a primeira linha possui os Dias da semana, para funcionar como um título.
 * @return Matriz de JLabel
 */
  private static JLabel[][] carregaMatrizLabels() {
    
    String[] DiasSemana = new String[] { "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb" };
    
    JLabel[][] days = new JLabel[7][7]; // Matriz com os dias
    
    // Coloco os títulos ( Dias da semana )
    for (int i = 0; i < 7; i++) {
	  days[0][i] = new JLabel(DiasSemana[i], JLabel.RIGHT);
    }
    
    // Carrego os labels vazios por enquanto
    for (int i = 1; i < 7; i++){
	  for (int j = 0; j < 7; j++) {
		days[i][j] = new JLabel(" ", JLabel.RIGHT);
	  }
    }
    
    return days;
  }
  
/**
 * Aqui a mágica acontece... ;)
 * Carrega os dias corretos em cada label.
 * @param days Matriz de labels
 */
  private static void carregaDatas(JLabel[][] days) {
    
    // Como eu crio um novo sem parâmetros, é para o dia de hoje
    Calendar calendar = new GregorianCalendar();
    calendar.set(Calendar.DAY_OF_MONTH, 1); // Seto no primeiro dia do mês atual, para começar a contagem corretamente.
    
    int offset = calendar.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY; // A distância do início da coluna (Para não errar os dias da semana...)
    int lastDay = calendar.getActualMaximum(Calendar.DATE); // O último dia do mês atual
    
    // Do primeiro ao último dia, vai carregando!
    for (int i = 0; i < lastDay; i++){
	  days[((i + offset) / 7) + 1][(i + offset) % 7].setText(String.valueOf(i + 1)); // A linha será a parte inteira da divisão por 7, a coluna será o resto...
    }
  }
  [/code]

Tenta isso aí. coloca no teu código e chama a função mostraCalendario(). Poste aí se funcionoou ou não…

cara … funcionou … valeu mesmo … brigadao :wink:

depois vou dar uma olhada melhor no codigo pra ver como vc fez … vlw

[quote=JamesBond]cara … funcionou … valeu mesmo … brigadao :wink:

depois vou dar uma olhada melhor no codigo pra ver como vc fez … vlw[/quote]

Eu tentei comentar o máximo que eu pude, se ainda ficar algum dúvida, poste aí. Eu posso mandar a classe completa, se tu quiser…

É um JFrame com um label indicando o dia no formato dd/MM/yyyy, toolTip com data por extenso, e no clique ele abre o calendário…