Ajuda no desenvolvimento de um relogio analogico, duvidas...xD

15 respostas
Vinicius_Zibetti_Res

A classe hora:

package Calculos;

import java.util.Calendar;

public class Hora {

    private int segundoAgora;
    private int minutoAgora;
    private int horaAgora;
    Calendar calendar;

    public Hora() {
        calendar = Calendar.getInstance();
        this.segundoAgora = this.calendar.get(Calendar.SECOND);
        this.minutoAgora = this.calendar.get(Calendar.MINUTE);
        this.horaAgora = this.calendar.get(Calendar.HOUR_OF_DAY);
    }

    public void atualizarHora() {
        this.segundoAgora = this.calendar.get(Calendar.SECOND);
        this.minutoAgora = this.calendar.get(Calendar.MINUTE);
        this.horaAgora = this.calendar.get(Calendar.HOUR_OF_DAY);
    }

    public int getSegundoAgora() {
        atualizarHora();
        return this.segundoAgora;
    }

    public int getMinutoAgora() {
        atualizarHora();
        return this.minutoAgora;
    }

    public int getHoraAgora() {
        atualizarHora();
        return this.horaAgora;
    }

    public String horaAtual() {
        return getHoraAgora() + ":" + getMinutoAgora() + ":" + getSegundoAgora();
    }
}

A classe que verifica qual imagem vai ser buscada de acordo com a hora atual:

package Calculos;

public class VerificaPonteiroHora {

    Hora horaAgora = new Hora();

    public String insrePonteiroHora() {
        String img = "";
        for (int i = 0; i < 24; i++) {
            if (this.horaAgora.getHoraAgora() == i) {
                if (i > 11 && i < 24) {
                    int aux = i - 12;
                    img = "/ImagensPonteiroHora/hora" + aux + ".png";
                } else {
                    img = "/ImagensPonteiroHora/hora" + i + ".png";
                }
            }
        }
        return img;
    }
}


Agora a classe principal que tem o JFrame.
A parte que insere a imagem na label de acordo com a hora:

public void InsreImgPonteiroHoras() {
        jLponteiroHora.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLponteiroHora.setIcon(new ImageIcon(getClass().getResource(calcs.insrePonteiroHora())));
    }

Quando eu clico neste botao o programa começa a rodar de verdade:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        do{
        InsreImgPonteiroHoras();
        }while(2 != 1);
    }

Se voce compilarem este codigo, vao ver que esta dando algo errado, ele não carrega nada fica la paradao sem acontecer nada e eu não tenho ideia do que esta errado, ja pgtei pra 1 colega e ele tbm n sabe o que ha de errado.

[size=18]Bom o que eu gostaria de saber é como resolver este probleminha ai, e tpw gostaria de fazer apartir desse projeto ai meu…[/size]

OBRIGADO !

15 Respostas

W

Dois comentarios:

  • Voce tem imagens para cada hora??? Nao seria mais facil desenhar ou ter uma imagem para o ponteiro e fazer o ponteiro mover??
if (this.horaAgora.getHoraAgora() == i) {  
                if (this.horaAgora.getHoraAgora() == 12) {  
                    img = "/ImagensPonteiroHora/hora0.png";  
                } else if (this.horaAgora.getHoraAgora() == 13) {  
                    img = "/ImagensPonteiroHora/hora1.png";  
                } else if (this.horaAgora.getHoraAgora() == 14) {  
                    img = "/ImagensPonteiroHora/hora2.png";  
                } else if (this.horaAgora.getHoraAgora() == 15) {  
                    img = "/ImagensPonteiroHora/hora3.png";  
                } else if (this.horaAgora.getHoraAgora() == 16) {  
                    img = "/ImagensPonteiroHora/hora4.png";  
                } else if (this.horaAgora.getHoraAgora() == 17) {  
                    img = "/ImagensPonteiroHora/hora5.png";  
                } else if (this.horaAgora.getHoraAgora() == 18) {  
                    img = "/ImagensPonteiroHora/hora6.png";  
                } else if (this.horaAgora.getHoraAgora() == 19) {  
                    img = "/ImagensPonteiroHora/hora7.png";  
                } else if (this.horaAgora.getHoraAgora() == 20) {  
                    img = "/ImagensPonteiroHora/hora8.png";  
                } else if (this.horaAgora.getHoraAgora() == 21) {  
                    img = "/ImagensPonteiroHora/hora9.png";  
                } else if (this.horaAgora.getHoraAgora() == 22) {  
                    img = "/ImagensPonteiroHora/hora10.png";  
                } else if (this.horaAgora.getHoraAgora() == 23) {  
                    img = "/ImagensPonteiroHora/hora11.png";  
                }else{  
                    img = "/ImagensPonteiroHora/hora"+i+".png";  
                }

Porque para as horas de 12 ate 23 vc especifica o arquivos da image e quando nao eh isso vc usa:

img = "/ImagensPonteiroHora/hora"+i+".png";

Nao poderia ser tudo igual, ai vc elimina esse monte de else if ???

Quanto a image nao aparecer, eu acho que o jeito mais simples seria fazer algo assim:
http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/LoadimagetoImageIconandaddittoPanel.htm

Adiciona um adiciona a imagem em um panel e adiciona o panel no frame.

//Daniel

Rummenigge

Meu irmão, primeiro modifique sua classe Hora, pois ela tem que possuir um método para atualizar a hora.

public void atualizarHora() {
    this.segundoAgora = calendar.get(Calendar.SECOND);  
    this.minutoAgora = calendar.get(Calendar.MINUTE);  
    this.horaAgora = calendar.get(Calendar.HOUR_OF_DAY);  
}

O objeto calendar tem que ser uma propriedade do objeto Hora.

private  int segundoAgora;  
private int minutoAgora;  
private int horaAgora;
Calendar calendar;

Do modo em que você estava fazendo, as propriedades só eram iniciadas apenas no construtor e depois não mudavam. Assim, toda vez você desse um getHoraAgora(), sempre retornaria o mesmo valor.

Vinicius_Zibetti_Res

Rummenigge:
Meu irmão, primeiro modifique sua classe Hora, pois ela tem que possuir um método para atualizar a hora.

public void atualizarHora() {
    this.segundoAgora = calendar.get(Calendar.SECOND);  
    this.minutoAgora = calendar.get(Calendar.MINUTE);  
    this.horaAgora = calendar.get(Calendar.HOUR_OF_DAY);  
}

Verdade amigo, voce tem razão, eu modifiquei a classe hora, agora ele esta atualizando a hora. Quanto a parte que n carrega a img ainda n consegui resolver, obrigado.
*PS: Ja editei o codigo la em cima ok ?

windsofhell:
Eu tenho 12 imagens, cada imagem correponde a um ponto fixo do relogio, tpw hora1.png é o ponteiro virado para o 1 no relogio.

int aux = i - 12;
Aqui é assim, tpw se for 13h, ele coloca o ponteiro na posicao de hora 1 do relogio… xD

AAhhh eu pensei um pouquinho e consegui rancar aqueles if, else if dali… XD

C

tente usar “getClass().getClassLoader().getResource(…);” ao inves de “getClass().getResource(…);”

Vinicius_Zibetti_Res

Não deu certo amigo, dessa forma ele retorna uma exessao:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(ImageIcon.java:167)
        at View.Relogio.InsreImgPonteiroHoras(Relogio.java:108)
        at View.Relogio.jBComecaRelogioActionPerformed(Relogio.java:92)
        at View.Relogio.access$000(Relogio.java:10)
        at View.Relogio$1.actionPerformed(Relogio.java:46)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
C

N vi problemas no codigo q vc postou, talvez o problema seja a posicao relativa ao componente com a imagem
-se vc usou um jlabel, troque para texto para verificar se está aparecendo, faça isso no construtor “new jlabel(“horas”)” e remova o loop
–se aparecer, entao verifique se é a logica, ao invez de setar a imagem, seta o texto “setText(horaAgora)”, se aparecer o texto entao erro ao carregar a imagem, se n problema na logica
–se n aparecer entao é problema de posicao, esqueceu de adicionar o component ou adicionou num container errado
-tente usar o repaint() apos mudar a imagem

Rummenigge

Se as imagens estão sendo carregadas corretamente, então o problema deve ser a falta de um repaint() no JFrame. Caso não seja, tente lançar o sistema do relógio em uma Thread.

Vinicius_Zibetti_Res

Opa, me mostra como eu faço essa parte do repaint(), ou como poe no thread… Conehco a pouco tempo a linguagem java.

[color=darkred]
E amigao, eu testei o que voce falou, na parte de or o set text, tpw se eu tirar do loop, ele busca a imagem ou o texto sim mas tpw o problema é que eu necessito que esjeta dentro do loop para que ele fique atualizando a imagem que vai buscar de acordo com a hora, tendeu ?.
[/color]

Vinicius_Zibetti_Res
package View;

import Calculos.Hora;
import Calculos.VerificaPonteiroHora;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class Relogio extends javax.swing.JFrame {

    private Calculos.VerificaPonteiroHora calcs;
    private Calculos.Hora hora;

    /** Creates new form Relogio */
    public Relogio() {
        initComponents();
        calcs = new VerificaPonteiroHora();
        hora = new Hora();
        setLocationRelativeTo(null);
        ImagemFundo();

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPFundo = new javax.swing.JPanel();
        jLDigital = new javax.swing.JLabel();
        jPPrincipal = new javax.swing.JPanel();
        jLfundo = new javax.swing.JLabel();
        jLponteiroHora = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Relógio Analógico");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jPFundo.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPFundo.setPreferredSize(new java.awt.Dimension(635, 634));

        jPPrincipal.setPreferredSize(new java.awt.Dimension(635, 634));

        javax.swing.GroupLayout jPPrincipalLayout = new javax.swing.GroupLayout(jPPrincipal);
        jPPrincipal.setLayout(jPPrincipalLayout);
        jPPrincipalLayout.setHorizontalGroup(
            jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 689, Short.MAX_VALUE)
            .addGroup(jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPPrincipalLayout.createSequentialGroup()
                    .addGap(17, 17, 17)
                    .addComponent(jLponteiroHora, javax.swing.GroupLayout.PREFERRED_SIZE, 655, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(17, Short.MAX_VALUE)))
            .addGroup(jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPPrincipalLayout.createSequentialGroup()
                    .addGap(27, 27, 27)
                    .addComponent(jLfundo, javax.swing.GroupLayout.DEFAULT_SIZE, 635, Short.MAX_VALUE)
                    .addGap(27, 27, 27)))
        );
        jPPrincipalLayout.setVerticalGroup(
            jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 676, Short.MAX_VALUE)
            .addGroup(jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPPrincipalLayout.createSequentialGroup()
                    .addGap(34, 34, 34)
                    .addComponent(jLponteiroHora, javax.swing.GroupLayout.DEFAULT_SIZE, 642, Short.MAX_VALUE)))
            .addGroup(jPPrincipalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPPrincipalLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLfundo, javax.swing.GroupLayout.PREFERRED_SIZE, 654, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
        );

        javax.swing.GroupLayout jPFundoLayout = new javax.swing.GroupLayout(jPFundo);
        jPFundo.setLayout(jPFundoLayout);
        jPFundoLayout.setHorizontalGroup(
            jPFundoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPFundoLayout.createSequentialGroup()
                .addComponent(jPPrincipal, javax.swing.GroupLayout.PREFERRED_SIZE, 689, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 5, Short.MAX_VALUE)
                .addComponent(jLDigital, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPFundoLayout.setVerticalGroup(
            jPFundoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPFundoLayout.createSequentialGroup()
                .addGroup(jPFundoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPFundoLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(jLDigital, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jPPrincipal, javax.swing.GroupLayout.DEFAULT_SIZE, 659, Short.MAX_VALUE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPFundo, javax.swing.GroupLayout.DEFAULT_SIZE, 784, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPFundo, javax.swing.GroupLayout.DEFAULT_SIZE, 663, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
        InsreImgPonteiroHoras();
        jLDigital.setText(hora.horaAtual());
    }                                    

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
        InsreImgPonteiroHoras();
        jLDigital.setText(hora.horaAtual());
    }                                 

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Relogio().setVisible(true);

            }
        });
    }

    public void ImagemFundo() {
        try {
            jLfundo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            jLfundo.setIcon(new ImageIcon(getClass().getResource("/ImagemFundo/FundoRelogio.png")));
        } catch (NullPointerException e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel carregar a imagem. Error: " + e);
        }
    }

    public void InsreImgPonteiroHoras() {
        try {
            jLponteiroHora.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            jLponteiroHora.setIcon(new ImageIcon(getClass().getResource(calcs.insrePonteiroHora())));
            jLponteiroHora.repaint();
        } catch (NullPointerException e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel carregar a imagem. Error: " + e);
        }
    }
    // Variables declaration - do not modify
    private javax.swing.JLabel jLDigital;
    private javax.swing.JLabel jLfundo;
    private javax.swing.JLabel jLponteiroHora;
    private javax.swing.JPanel jPFundo;
    private javax.swing.JPanel jPPrincipal;
    // End of variables declaration
}
Vinicius_Zibetti_Res

[color=red]GALERAAAAAAAAAAAAAAAAAAAAA olha o que eu percebi aqui, ele NÃO precisa estar dentro de 1 loop pra atualizar eu posso deixar em um evento assim:[/color]

private void jBComecaRelogioFocusGained(java.awt.event.FocusEvent evt) { InsreImgPonteiroHoras(); }

Dessa forma ele atualiza em precisar estar no loop, eu testei aqui e deu certo…

Rummenigge

Tente fazer assim:

private  void jBComecaRelogioActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        do {  
            Thread t = new Thread(new Runnable() {
                 public void run() {
                      InsreImgPonteiroHoras();
                      Thread.sleep(1000);
                 }
            });
        } while (true);  // Em vez de usar 1 != 2 utiliza true para ficar em laço infinito
    }

Vai ficar um pouco gambiarra, mas é só por experiência mesmo. Sem dizer que não está “Thread Safe”, mas tenta ai espero que der certo.

Obs.: Caso rode como você esperava, evite apertar o botão mais de uma vez.

Vinicius_Zibetti_Res

Rummenigge:
Tente fazer assim:

private  void jBComecaRelogioActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        do {  
            Thread t = new Thread(new Runnable() {
                 public void run() {
                      InsreImgPonteiroHoras();
                      Thread.sleep(1000);
                 }
            });
        } while (true);  // Em vez de usar 1 != 2 utiliza true para ficar em laço infinito
    }

Vai ficar um pouco gambiarra, mas é só por experiência mesmo. Sem dizer que não está “Thread Safe”, mas tenta ai espero que der certo.

Obs.: Caso rode como você esperava, evite apertar o botão mais de uma vez.

Bom nesse codigo faltava a exessão mas mesmo com a exessão não funcionou, a unica maneira q consegui fazer aqui pra atualziar eh colocar um EVENTO assim:

private void jBComecaRelogioFocusGained(java.awt.event.FocusEvent evt) { InsreImgPonteiroHoras(); }

Dai ele roda do jeito que eu queria…xD

Vinicius_Zibetti_Res

Galera, observando meu codigo aqui, como fasso para adicionar uma imagem de fundo no meu JPfundo ?

Gostaria que estivesse dentro de um metodo isso. OBRIGADO !

Rummenigge

Você tem que criar uma classe que herde do JPanel e sobrescrever o método paint() de modo que ele pinte uma imagem no fundo assim que o painel for carregado.

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    super.paint(g2d);

    g2d.drawImage(Imagem, x, y, null);
}

Espero que ajude, caso tenha dúvidas sobre BufferedImage e como pintar essa imagem no painel, dê uma olhada na documentação de Graphics2D em Java Tutorials.
http://download.oracle.com/javase/tutorial/2d/images/index.html

Vinicius_Zibetti_Res

Opa, gente pode por este topico como solucionado, eu consegui fazer o que eu estava querendo. Se alguem quiser pegar o codigo eu vo editar la em cima.
Até mais obrigado !

Criado 18 de abril de 2011
Ultima resposta 20 de abr. de 2011
Respostas 15
Participantes 4