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
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
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
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
E ai pessoal blz ?
resolvi ressuscitar o topico …
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…
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
depois vou dar uma olhada melhor no codigo pra ver como vc fez … vlw
[quote=JamesBond]cara … funcionou … valeu mesmo … brigadao
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…