Você está aqui: Java ::: Java Swing - Jogos e Aplicações Úteis ::: Animação, Animações, Técnicas de Animação

Como criar um relógio analógico em Java Swing - Código completo com variáveis e comentários em português

Quantidade de visualizações: 1199 vezes
Nesta dica mostrarei um código para a criação de um relógio analógico completo em Python, com comentários detalhados e fácil de entender. Veja a imagem:



Por simplicidade, eu mantive a mesma cor para todos os elementos da animação e deixei somente o básico mesmo, para que você possa se concentrar nas partes mais importantes.

Neste código você aprenderá como definir o tamanho, título e cor de fundo para uma janela do Java Swing. Aprenderá também como criar um Timer em Java e usá-lo para controlar o tempo de atualização dos elementos de uma animação.

Por fim, o código mostra como calcular o ângulo dos ponteiros das horas, minutos e segundos e efetuar o desenho das retas saindo do centro do círculo. Você sabia, por exemplo, que o ângulo de 45 graus corresponde exatamente à hora 1:30hs?

Em vários exemplos de relógios analógicos na internet, o ponteiro das horas fica preso à uma determinada hora, aguardando o ponteiro dos segundos completar um giro completo. No código que apresento aqui, eu obtive a hora atual como um decimal, o que faz com que o ponteiro das horas mostre a posição real das hora, como um relógio analógico do mundo real.

Para estudantes de matemática, engenharia e física, este código é uma boa aplicação da técnica de se converter coordenadas polares para coordenadas cartesianas.

Eis o código completo para o relógio analógico em Java Swing. Boa diversão.

Código para a classe RelogioDigital.java:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package estudos;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.time.LocalTime;
import javax.swing.JPanel;
import javax.swing.Timer;

class RelogioDigital extends JPanel {
  // algumas variáveis de configuração
  int largura_painel = 600;
  int altura_painel = 400;
  int raio = 150; 
  int x_inicial = 300;
  int y_inicial = 200;
  int distancia_aro = 20;
  
  // construtor da classe
  public RelogioDigital(){
    // definimos o tamanho do JPanel
    this.setPreferredSize(new Dimension(largura_painel, altura_painel));
    // definimos a cor de fundo
    this.setBackground(Color.WHITE);
 
    // iniciamos o Timer com intervalo de 1 segundo
    new Timer(1000, (ActionEvent e) -> {
      // redesenha o painel
      this.repaint();
    }).start();
  }
  
  @Override
  public void paintComponent(Graphics gg) {
    super.paintComponent(gg);
    // vamos obter o objeto Graphics2D
    Graphics2D g = (Graphics2D) gg;
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
      RenderingHints.VALUE_ANTIALIAS_ON);
    
    // vamos definir a fonte para desenhar os números do relógio
    g.setFont(new Font("TimesRoman", Font.PLAIN, 20));
    
    // desenha o círculo do relógio
    g.drawOval(x_inicial - raio, y_inicial - raio, raio * 2, raio * 2);
    // desenha o círculo interno do relógio
    g.fillOval(x_inicial - 4, y_inicial - 4, 8, 8);
    
    // vamos desenhar os números do relório (1-12)
    for(int i = 1; i < 13; i++){
      // calcula o ângulo dessa hora
      double angulo = Math.toRadians((i * (360 / 12)) - 90);
      // agora convertemos o ângulo e o raio para coordenadas cartesianas
      int x = (int)(Math.cos(angulo) * (raio - distancia_aro)) + x_inicial - 5;
      if(i > 9){
        x = (int)(Math.cos(angulo) * (raio - distancia_aro)) + x_inicial - 10;
      }
      int y = (int)(Math.sin(angulo) * (raio - distancia_aro)) + y_inicial + 5;
      g.drawString(Integer.toString(i), x, y);
    }
    
    // agora vamos obter as horas, minutos e segundos
    LocalTime time = LocalTime.now();
    double horas = time.getHour();
    int minutos = time.getMinute();
    int segundos = time.getSecond();
    // ajustamos as horas para tratar a hora decimal (com frações de horas)
    horas = horas + (minutos * (1 / 60)) + (segundos * (1 / 3600));
    
    // vamos desenhar o ponteiro das horas
    double angulo_horas = Math.toRadians((horas * (360 / 12)) - 90);
    // agora convertemos o ângulo e o raio para coordenadas cartesianas
    int x = (int)(Math.cos(angulo_horas) * (raio - 75)) + x_inicial - 5;
    int y = (int)(Math.sin(angulo_horas) * (raio - 75)) + y_inicial + 5;
    g.drawLine(x_inicial, y_inicial, x, y);
    
    // desenha o ponteiro dos minutos
    double angulo_minutos = Math.toRadians((minutos * (360 / 60)) - 90);
    // agora convertemos o ângulo e o raio para coordenadas cartesianas
    x = (int)(Math.cos(angulo_minutos) * (raio - 45)) + x_inicial - 5;
    y = (int)(Math.sin(angulo_minutos) * (raio - 45)) + y_inicial + 5;
    g.drawLine(x_inicial, y_inicial, x, y);
    
    // desenha o ponteiro dos segundos
    double angulo_segundos = Math.toRadians((segundos * (360 / 60)) - 90);
    // agora convertemos o ângulo e o raio para coordenadas cartesianas
    x = (int)(Math.cos(angulo_segundos) * (raio - 35)) + x_inicial - 5;
    y = (int)(Math.sin(angulo_segundos) * (raio - 35)) + y_inicial + 5;
    g.drawLine(x_inicial, y_inicial, x, y);
  }
}

Código para a classe principal Estudos.java:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package estudos;

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Estudos extends JFrame{
  // construtor da classe
  public Estudos(){
    super("Relógio Analógica em Java Swing");
     
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
    
    // vamos adicionar o JPanel na tela principal
    RelogioDigital relogio = new RelogioDigital();
    this.add(relogio, BorderLayout.CENTER);
    this.setResizable(false);
    this.pack();
    
    // vamos centralizar a janela na tela
    this.setLocationRelativeTo(null);
    // mostra a janela principal 
    this.setVisible(true);
  }
  
  public static void main(String args[]){
    SwingUtilities.invokeLater(() -> {
      Estudos app = new Estudos();
      app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }); 
  }
}


Link para compartilhar na Internet ou com seus amigos:

Java ::: Desafios e Lista de Exercícios Resolvidos ::: Java Básico

Exercícios Resolvidos de Java - Escreva um programa Java que pede para o usuário informar o salário de uma pessoa, o valor de um empréstimo e a quantidade de prestações

Quantidade de visualizações: 12008 vezes
Pergunta/Tarefa:

Escreva um programa Java que pede para o usuário informar o salário de uma pessoa, o valor de um empréstimo e a quantidade de prestações.

Se o valor da prestação for maior que 20% do salário seu código deverá mostrar a mensagem "Empréstimo não pode ser concedido". Se o empréstimo puder ser concedido escreva "Empréstimo pode ser concedido".

Sua saída deve ser parecida com:

Informe o salário: 1350
Informe o valor do empréstimo: 6000
Informe a quantidade de parcelas: 12
O valor das parcelas do empréstimo é: 500.0
Empréstimo não pode ser concedido
Resposta/Solução:

Veja a resolução comentada deste exercício usando Java:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    // variáveis usadas na resolução do problema
    double salario, emprestimo, valor_parcela;
    int quant_prestacoes;

    // para ler a entrada do usuário
    Scanner entrada = new Scanner(System.in);  
    
    // vamos ler os dados
    System.out.print("Informe o salário: ");
    salario = Double.parseDouble(entrada.nextLine());
    System.out.print("Informe o valor do empréstimo: ");
    emprestimo = Double.parseDouble(entrada.nextLine());
    System.out.print("Informe a quantidade de parcelas: ");
    quant_prestacoes = Integer.parseInt(entrada.nextLine());
    
    // vamos calcular e mostrar o valor da parcela do empréstimo
    valor_parcela = emprestimo / quant_prestacoes;
    System.out.println("O valor das parcelas do empréstimo é: " +
      valor_parcela);
    
    // o empréstimo pode ser concedido?
    if (valor_parcela > (salario * (20.0 / 100.0))) {
      System.out.println("Empréstimo não pode ser concedido");
    }
    else{
      System.out.println("Empréstimo pode ser concedido");
    }
    
    System.out.println("\n");
  }
}



Java ::: Coleções (Collections) ::: ArrayList

Como passar uma ArrayList para um método Java - Como escrever um método Java que recebe uma ArrayList

Quantidade de visualizações: 12040 vezes
Em algumas situações precisamos passar um objeto da classe ArrayList para um método Java. Esta dica mostra como isso pode ser feito:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package estudos_java;

import java.util.*;

public class Estudos{
  public static void main(String[] args){
    // vamos criar um ArrayList, adicionar alguns elementos
    // e passá-lo para um método
    ArrayList<String> nomes = new ArrayList<>();
    nomes.add("Osmar J. Silva");    
    nomes.add("Fernanda de Castro");
    nomes.add("José de Oliveira");

    // vamos passar o ArrayList para o método
    imprimir(nomes);

    System.exit(0);
  }

  // um método que recebe um ArrayList e exibe o
  // o valor de seus elementos
  public static void imprimir(ArrayList<String> lista){
    for(int i = 0; i < lista.size(); i++){
      System.out.println(lista.get(i));
    }
  }
}

Ao executar este código Java nós teremos o seguinte resultado:

Osmar J. Silva
Fernanda de Castro
José de Oliveira


Java ::: Fundamentos da Linguagem ::: Tipos de Dados

Como usar null em Java

Quantidade de visualizações: 31601 vezes
O tipo de dados null é um tipo (ou valor) especial que indica que uma referência não está apontando para nenhum objeto, ou seja, aponta para uma posição de memória nula. Este tipo pode ser atribuído (ou testado) apenas a referências. Seu uso não é permitido com primitivos.

Veja um trecho de código no qual definimos que uma variável do tipo String aponta para um objeto nulo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

public class Estudos{
  public static void main(String args[]){
    String nome = null;  

    System.out.println(nome.length());    

    System.exit(0);
  }
}

Este código compila normalmente. Porém, ao tentarmos executá-lo, temos uma exceção de tempo de execução NullPointerException:

Exception in thread "main" 
java.lang.NullPointerException
  at Estudos.main(Estudos.java:5)


Isso aconteceu porque estamos tentando executar um método de um objeto que não existe.

Uma técnica muito valiosa é testar se uma referência não está apontando para um objeto nulo. Veja como isso é feito:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

public class Estudos{
  public static void main(String args[]){
    String nome = null;  

    if(nome != null)
      System.out.println(nome.length());    
    else
      System.out.println("Objeto é nulo.");      

    System.exit(0);
  }
}

Tenha em mente que, quando uma referência recebe o valor null, o objeto para o qual ela apontava fica imediatamente disponível para o coletor de lixo (Garbagge Colector), ou seja, a memória ocupada pelo objeto pode ser liberada a qualquer momento.

Veja agora o que acontece quando tentamos atribuir o valor null a um primitivo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

public class Estudos{
  public static void main(String args[]){
    int valor = null;     

    System.exit(0);
  }
}

Eis a mensagem de erro de compilação:

Estudos.java:3: incompatible types
found   : <nulltype>
required: int
 int valor = null;
             ^
1 error



Vamos testar seus conhecimentos em

Dimensionamento de pilares de extremidade

Pilares são elementos verticais cujo principal esforço normal solicitante é o de compressão. Eles podem ser classificados de acordo com sua posição na estrutura.

Sobre os pilares de extremidade, assinale a alternativa correta.

A) Os pilares de extremidade se situam no canto da edificação e têm descontinuidade nas duas direções.

B) Nos pilares de extremidade, atuam forças normais e momentos que geram o esforço de flexão normal composta.

C) Todos os pilares de extremidade são classificados como esbeltos, pois seu índice de esbeltez é acima de 200.

D) Para esses pilares, não se recomenda usar o momento mínimo para determinar as solicitações atuantes.

E) Esses pilares são submetidos à compressão pura, pois não têm excentricidades iniciais.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Qual o resultado da execução do seguinte código JavaScript?

document.write(false == '0');

A) 0

B) false

C) 1

D) true

E) Erro de execução
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Um arquivo JavaScript externo precisa, obrigatoriamente, conter a tag <script>

A) Verdadeiro

B) Falso
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

A linguagem JavaScript diferencia letras maiúsculas de letras minúsculas (case-sensitive)?

A) Sim

B) Não
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Como arredondar o valor 7.25 para o inteiro mais próximo em JavaScript?

A) Math.rnd(7.25)

B) Math.round(7.25)

C) rnd(7.25)

D) round(7.25)
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de Java

Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 31 usuários muito felizes estudando em nosso site.