[Grupo de Estudos – Java] Criando instâncias de objetos

No último post do grupo de estudos vimos como usar os gerenciadores de Layout, sabendo como usá-los podemos seguir para o próximo passo. Instanciar objetos.

Se você está tendo ou já teve aulas de Programação Orientada a Objetos certamente já ouviu falar sobre as instâncias. Mas eu acredito que ao ver o uso prático as coisas vão ficando mais claras. Em primeiro lugar quero dizer que ao executar cada interface gráfica apresentada desde o começo do nosso estudo, você está criando uma instância da mesma. Mas um programador pode querer invocar outras janelas para executar ações paralelas, ou consultas adicionais, seja qual for o motivo, ao chamar uma outra interface gráfica nós estamos instanciando uma outra classe.

Para exemplificar eu vou usar um código novo. Um relógio digital em Java.

/* @(#)Relogio.java
 *
 * @author Luciano Santos
 * @version 1.00 2010/4/8
 */
//realizando os imports
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;
import java.util.Calendar;

/** abrindo a classe com extensao para JFrame [permitindo a criacao de interface grafica]
 * A classe deve ser declarada publica para que a Maquina Virtual "enxergue" a classe e interprete-a
 */
public class Relogio extends JFrame {

 //declarando os componentes da janela
 JLabel lblHorario;
 //declarando variaveis
 int hh, mm, ss; //*
 Calendar hora; //*Hora
 DecimalFormat formato; //*

 /* abrindo o metodo construtor da classe
 * Esse trecho do codigo [ou da clase] sera o resposavel pela CONSTRUCAO da interface grafica na memoria,
 * por isso tem esse nome.
 * o construtor deve ser publico e ter o mesmo nome da classe,
 * lembrando que java eh case sensitive, entao o nome do construtor deve ser identico ao da classe.
 */
 public Relogio() {
 //definindo o titulo da janela
 setTitle("Relogio");

 //definindo tamanho e layout da janela
 setSize(160, 50);
 setLocationRelativeTo(null);//centralizando a janela
 setLayout(new FlowLayout());

 //definindo operacao padrao para o botao fechar
 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//sem esta linha a janela nao fecha pelo botao fechar.

 lblHorario = new JLabel("");//configurando o label inicial
 add(lblHorario);//adicionando o label configurado a janela

 Timer time = new Timer(0, ativar);
 time.start();
 }

 private String formatar(int num) {
 formato = new DecimalFormat("00");//configurando para que o valor usado apresente 2 digitos
 return formato.format(num);
 }

 private void HORAS() {
 hora = Calendar.getInstance();
 hh = hora.get(Calendar.HOUR_OF_DAY);//registrando a hora
 mm = hora.get(Calendar.MINUTE);//registrando os minutos
 ss = hora.get(Calendar.SECOND);//registrando os segundos
 lblHorario.setText(formatar(hh) + ":" + formatar(mm) + ":" + formatar(ss));//usando os valores registrados para formar a string com a hora atual

 }
 ActionListener ativar = (new ActionListener() {
 public void actionPerformed(ActionEvent e) {
 HORAS();
 }
 });

 /* Abrindo o metodo principal da classe [Main em ingles significa principal]
 * Este metodo deve ser publico, estatico e vazio, ou seja, sempre vai ter a mesma estrutura;
 * Na sua criacao eh definida uma String, que recebera possiveis argumentos passados pelo usuario.
 * o nome da string costuma ser args [por abreviacao de argumentos]
 * mas pode ser outro nome qualquer, como a, argumentos, parametros, param, etc
 *
 * mais tarde podemos trabalhar com classes usando argumentos para String
 */
 public static void main(String[] args) {
 /*instanciando o metodo construtor*/
 Relogio instancia = new Relogio();//nesta linha o codigo carrega o construtor para memoria, montando a tela NA MEMORIA
 instancia.setVisible(true);//definindo a visibilidade da tela
 }
}


O código acima traz poucas novidades, a principal delas acredito que seja a formatação de valores que ocorre da linha 50 a 53, além disso temos uma reação nova na linha 41, ao invés de usar o EXIT_ON_CLOSE eu usei o DISPOSE_ON_CLOSE, contudo a criação deste código foi só o começo.

Agora vamos partir para uma interface mais complexa, utilizando painéis, gerenciadores de layouts diversos e finalmente instanciando uma classe a partir de outra, ou seja, chamar uma outra interface gráfica ao clicar num botão. Lembram quando falei sobre o gerenciador de layouts BorderLayout, que trabalhava com vários conteiners? Ao invés de usar diversos conteiners eu usei o conteiner padrão e adicionei painéis em 3 regiões.

Eis o código:

/**
 *
 * @author Luciano Santos
 */
//importando todas as classes dos pacotes AWT, Swing e Event
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class GrupoEstudo extends JFrame {
 // declarando os componentes

 JLabel lblTitulo, lblLay;
 JButton btnRelogio;
 JTextArea txtaCentro;
 JPanel pnlMenu, pnlCentro, pnlSul;

 GrupoEstudo() {
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //definindo a acao de saida

 setTitle("Coletanea de Aplicativos");//definindo titulo da janela
 setSize(600, 400);//definindo tamanho da janela
 setLocationRelativeTo(null);
 setLayout(new BorderLayout());//definindo o layout do conteiner

 //criando os paineis e adicionando ao conteiner principal
 pnlCentro = new JPanel();
 add(pnlCentro, BorderLayout.CENTER);//adicionando um painel na regiao central do conteiner
 pnlMenu = new JPanel();
 add(pnlMenu, BorderLayout.EAST);//adicionando um painel na regiao leste do conteiner
 pnlSul = new JPanel();
 add(pnlSul, BorderLayout.SOUTH);//adicionando um painel na regiao sul do conteiner

 //configurando e adicionando componentes a regiao norte do conteiner principal
 lblTitulo = new JLabel("[Grupo de Estudos - Java] https://analisedesistemas.wordpress.com");
 add(lblTitulo, BorderLayout.NORTH);

 //configurando e adicionando componentes ao painel central
 pnlCentro.setLayout(null);//definindo layout do painel
 txtaCentro = new JTextArea();
 txtaCentro.setBounds(20, 20, 300, 200);
 txtaCentro.setLineWrap(true);
 txtaCentro.setBackground(pnlCentro.getBackground());
 txtaCentro.setText("Bem vindo ao aplicativo coletor, desenvolvido para reunir seus códigos num só lugar.\n\nSe você fez os códigos da matéria sobre gerenciadores de layout, já terá um material inicial\n\nClique nos botões ao lado para chamar suas interfaces.");
 pnlCentro.add(txtaCentro);

 //configurando e adicionando componentes ao painel leste
 btnRelogio = new JButton("Relógio");
 btnRelogio.addActionListener(new relogio());//pondo o botao em espera
 pnlMenu.setLayout(new GridLayout(10,1));//definindo layout do painel
 pnlMenu.add(btnRelogio);

 //configurando e adicionando componentes ao painel sul
 pnlSul.setLayout(new FlowLayout());//definindo layout do painel
 lblLay = new JLabel("Layouts: ");
 pnlSul.add(lblLay);

 }
 public class relogio implements ActionListener{
 public void actionPerformed(ActionEvent click){

 Relogio tela = new Relogio();//instanciando a classe Relogio
 tela.setVisible(true);
 }
 }
 public static void main(String[] args) {
 GrupoEstudo lancador = new GrupoEstudo(); //instanciado o construtor
 lancador.setVisible(true); //deixando a janela visivel
 }
}

Ao clicar no botão relógio é criada uma instância da classe relógio:

A maioria das intruções acima já foi abordada em outros posts, por isso só vou falar sobre as linhas 42 a 45, que estão trabalhando com a configuração da TextArea, todos componentes tem opções de formatação, e eu dei uma amostra do que pode ser feito com este.
Acho que os comentários no código explicam boa parte do que está sendo feito, mas qualquer dúvida é só comentar!

ps. Eu poderia extender o segundo código com mais itens, mais componentes, mas deixaria tudo mais confuso ainda, então continuamos com ele na próxima.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s