terça-feira, 16 de novembro de 2010

Aula 12 - 16.11.2010 - Trabalho final da disciplina (Continuação)

Segue dica do Cleiton para alinhar colunas numéricas na JTable


// Colocando mascara na celula do jTable...
jTableDiaria.getColumnModel().getColumn(1).setCellRenderer(new DecimalFormatRenderer() );


class DecimalFormatRenderer extends DefaultTableCellRenderer {
   private final DecimalFormat formatter = new DecimalFormat( "#0.00" );

   public DecimalFormatRenderer() {
      setHorizontalAlignment(SwingConstants.RIGHT);  
   }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
       value = formatter.format(value);
       return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column );
    }
}

terça-feira, 28 de setembro de 2010

Aula 7 - 28.09.2010 - Classes Java

Menu.java

package br.edu.metodista.acesso.menu;

public class Menu {

   private Long id;
   private String nome;

   public Long getId() { return id; }
   public void setId(Long id) { this.id = id; }

   public String getNome() { return nome; }
   public void setNome(String nome) {       this.nome = nome; }

   @Override
   public boolean equals(Object obj) {
      if (obj == null) {
         return false;
      }
      if (getClass() != obj.getClass()) {
         return false;
      }
      final Menu other = (Menu) obj;
      if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
         return false;
      }
      return true;
   }

   @Override
   public int hashCode() {
      int hash = 7;
      hash = 83 * hash + (this.id != null ? this.id.hashCode() : 0);
      return hash;
   }

   @Override
   public String toString() {
      return nome;
   }
}


MenuDAO.java

package br.edu.metodista.acesso.menu;

import java.sql.*;
import java.util.*;
import br.edu.metodista.ipa.bd.*;

public class MenuDAO {

   public int salvar(Menu menu) throws Exception {
      if (existe(menu))
         return alterar(menu);
      else
         return incluir(menu);
   }

   public int incluir(Menu menu) throws Exception {
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(INCLUIR_SQL);
      try {
         stmt.setLong(1, BD.getProximoId(TABELA));
         stmt.setString(2, menu.getNome());
         return stmt.executeUpdate();
      } finally {
         stmt.close();
         conn.close();
      }
   }

   public int alterar(Menu menu) throws Exception {
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(ALTERAR_SQL);
      try {
         stmt.setLong(1, menu.getId());
         stmt.setString(2, menu.getNome());
         stmt.setLong(3, menu.getId());
         return stmt.executeUpdate();
      } finally {
         stmt.close();
         conn.close();
      }
   }

   public int excluir(Menu menu) throws Exception {
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(EXCLUIR_SQL);
      try {
         stmt.setLong(1, menu.getId());
         return stmt.executeUpdate();
      } finally {
         stmt.close();
         conn.close();
      }
   }

   public boolean existe(Menu menu) throws Exception {
      if (menu.getId() == null)
         return false;
      
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(EXISTE_SQL);
      try {
         stmt.setLong(1, menu.getId());
         RecordSet rs = new RecordSet(stmt.executeQuery());
         if (rs.next())
            return true;
         return false;
      } finally {
         stmt.close();
         conn.close();
      }
   }

   public boolean carregar(Menu menu) throws Exception {
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(CARREGAR_SQL);
      try {
         stmt.setLong(1, menu.getId());
         RecordSet rs = new RecordSet(stmt.executeQuery());
         if (rs.next()) {
            menu.setNome(rs.getString("nome"));
            return true;
         }
         return false;
      } finally {
         stmt.close();
         conn.close();
      }
   }

   public ArrayList listar() throws Exception {
      ArrayList lista = new ArrayList();
      Connection conn = BD.getConnection();
      PreparedStatement stmt = conn.prepareStatement(LISTAR_SQL);
      try {
         RecordSet rs = new RecordSet(stmt.executeQuery());
         while (rs.next()) {
            Menu menu = new Menu();
            menu.setId(rs.getLong("id"));
            menu.setNome(rs.getString("nome"));
         }
         return lista;
      } finally {
         stmt.close();
         conn.close();
      }
   }

   private static final String TABELA = "tbl_menu";
   private static final String INCLUIR_SQL  = "INSERT INTO " + TABELA + " (id, nome) VALUES (?,?)";
   private static final String ALTERAR_SQL  = "UPDATE " + TABELA + " SET id=?, nome=? WHERE id=?";
   private static final String EXCLUIR_SQL  = "DELETE FROM " + TABELA + " WHERE id=?";
   private static final String CARREGAR_SQL = "SELECT * FROM " + TABELA + " WHERE id=?";
   private static final String EXISTE_SQL   = "SELECT id FROM " + TABELA + " WHERE id=?";
   private static final String LISTAR_SQL   = "SELECT * FROM " + TABELA + " ";

   public static void main(String[] args) throws Exception {
      Menu s = null;

      s = new Menu();
      s.setNome("Países");
      new MenuDAO().salvar(s);

      s = new Menu();
      s.setNome("Estados");
      new MenuDAO().salvar(s);

      s = new Menu();
      s.setNome("Cidades");
      new MenuDAO().salvar(s);
   }
}

Aula 7 - 28.09.2010

Esta semana daremos continuidade à criação da estrutura que servirá de base comum para todos os trabalhos que serão entregues na disciplina.

Para tanto, o seguinte modelo será utilizado para a criação das classes java para controle de acesso ao sistema.


Importante notar que para completar a arquitetura, para cada classe de negócio deverá ser avaliada a criação de uma classe de acesso aos dados (DAO), além da interface gráfica com o usuário.

Abaixo segue uma proposta básica de script SQL para mapear a estrutura OO do diagrama acima:

CREATE TABLE tbl_menu (
 id INTEGER NOT NULL PRIMARY KEY,
 nome VARCHAR(100) NOT NULL
);

CREATE TABLE tbl_grupo (
 id INTEGER NOT NULL PRIMARY KEY,
 cod VARCHAR(12) NOT NULL UNIQUE,
 nome VARCHAR(60) NOT NULL
);

CREATE TABLE tbl_permissao (
 id INTEGER NOT NULL PRIMARY KEY,
 id_grupo INTEGER NOT NULL REFERENCES tbl_grupo(id),
 id_menu INTEGER NOT NULL REFERENCES tbl_menu(id)
);

CREATE TABLE tbl_usuario (
 id INTEGER NOT NULL PRIMARY KEY,
 login VARCHAR(20) NOT NULL UNIQUE,
 senha VARCHAR(20) NOT NULL,
 cpf VARCHAR(20),
 id_grupo INTEGER NOT NULL REFERENCES tbl_grupo(id)
);

terça-feira, 21 de setembro de 2010

Aula 6 - 21.09.2010

Dica do desafio de hoje:

TODO: recolocar o código do ResultSetMetadata.

Aproveitando o post, segue abaixo o código da classe RSet:

package br.edu.metodista.ipa.bd;

import java.sql.*;
import com.sun.rowset.CachedRowSetImpl;

public class RecordSet extends CachedRowSetImpl {

    public RecordSet(ResultSet rs) throws SQLException {
        super();
        try {
            populate(rs);
        } finally {
            rs.close();
        }
    }
}

terça-feira, 14 de setembro de 2010

Aula 5 - 14.09.2010

Hoje será visto como o Java se comunica com um Banco de Dados Relacional.

Importante ressaltar que para um uso mais efetivo de bancos de dados relacionais (Oracle, Postgresql, MySQL, DB2, SQLServer, etc) a teoria relacional deve ser compreendida da melhor forma possível. Abaixo, alguns links para auxiliar neste percurso:
Conceito como "Chave Primária", "Chave Estrangeira", "Integridade Relacional" devem ser compreendidas para se trabalhar bem com um banco de dados relacional.

Para o Java, é relativamente simples realizar uma conexão a um banco de dados relacional para posterior envio de comandos e recebimento de retornos. Para tanto, uma classe como a exposta abaixo é suficiente:

package br.edu.metodista.ipa.bd;

import java.sql.*;

public class BD {

    private static final String url =
        "jdbc:derby://localhost:1527/ipa;create=true;user=admin;password=123123";

    public static Connection getConnection() throws Exception {
        return DriverManager.getConnection(url);
    }

    public static int execute(String sql) throws Exception {
        Connection conn = BD.getConnection();
        Statement stmt = conn.createStatement();
        try {
            return stmt.executeUpdate(sql);
        } finally {
            stmt.close();
            conn.close();
        }
    }

    public static RecordSet executeQuery(String sql) throws Exception {
        Connection conn = BD.getConnection();
        Statement stmt = conn.createStatement();
        try {
            ResultSet rs = stmt.executeQuery(sql);
            RecordSet rset = new RecordSet(rs);
            return rset;
        } finally {
            stmt.close();
            conn.close();
        }
    }

    public static Long getProximoId(String tabela) throws Exception {
        String sql = "SELECT MAX(id)+1 as ID FROM " + tabela;
        RecordSet rs = executeQuery(sql);
        if (rs.next())
            return rs.getLong(1);
        return 0L;
    }


    public static void main(String[] args) throws Exception {
      System.out.println(getConnection());
   }
}

terça-feira, 31 de agosto de 2010

Aula 4 - 31.08.2010

Hoje, iremos finalizar a criação do nosso primeiro sistema com inteface gráfica utilizando a API javax.swing.*.

Links interessantes de sites com dicas para melhorar e explorar ainda mais a programação Desktop:

Outros links bastante interessantes:


Sobre persistência de objetovs, o ideal, atualmente, é se trabalhar com um Banco de Dados Relacional (MySQL, Postgresql, Oracle, SQL Server, etc). Porém, este assunto será visto em um momento futuro.

Por ora, para operacionalizar a nossa aplicação, faremos uso da tecnologia XML para persistir nossos objetos da memória RAM para o DISK. Abaixo segue a classe-base necessária para permitir realizar esta ação de forma transparente:

package ipa.es.utils;

import java.io.*;
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;

/** Classe que representa o mecanismo de persistência através de XML. */
public class XMLUtils {

/** Atributo que mantém o nome do diretório dos arquivos .xml. */
private static String dir = "c:/";

/** Método que seta o diretório onde serão salvos os .xml
 * @param String Contendo o nome do diretório. */
public static void setDiretorio(String d) {
 dir = d;
}

/** Método que retorna o diretório onde serão salvos os .xml
 * @return String Retorna o nome diretório. */
public static String getDiretorio() {
 return dir;
}

/** Método que salva o objeto em um arquivo XML.
 * @param objeto Contendo o objeto.
 * @param arq Contendo o nome do arquivo .xml. */
public static void salvar(Object objeto, String arq) throws Exception {
 XMLEncoder xml = null;
 try {
  File f = new File(getDiretorio() + arq);
  xml = new XMLEncoder(
      new BufferedOutputStream(
      new FileOutputStream(f)));
  xml.writeObject(objeto);
  xml.flush();
 } finally {
  if (xml != null) {
   xml.close();
  }
 }
}

/** Método que retorna um objeto a partir de um arquivo XML.
 * @param arq Contendo o nome do arquivo .xml.
 * @return Object Contendo o objeto no XML. */
public static Object buscar(String arq) throws Exception {
 Object objeto = null;
 XMLDecoder xml = null;
 try {
  File f = new File(getDiretorio() + arq);
  if (!f.exists())
   return null;
  xml = new XMLDecoder(
      new BufferedInputStream(
      new FileInputStream(f)));
  objeto = xml.readObject();
 } finally {
  if (xml != null) {
   xml.close();
  }
 }
 return objeto;
}

/** Método para testes. */
public static void main(String args[]) throws Exception {
 String s = "IPA";
 XMLUtils.salvar(s, "Teste.xml");
 System.out.println("Lendo arquivo: " + XMLUtils.buscar("Teste.xml").toString());
}
}

Aula 3 - 24.08.2010

Na aula 3, foi dado continuidade à construção da interface gráfica básica utilizando a API javax.swing.*

Nesta ocasião, além dos componentes padrões da API foi apresentado o recurso de Look And Feel. Abaixo, seguem alguns links interessantes sobre o assunto: 
Link oficial:

sexta-feira, 13 de agosto de 2010

Aula 2 - 17.08.2010

Pessoal,

Conforme combinado, no dia 17/Agosto não estarei em Porto Alegre e a aula será realizada sem a minha presença, porém, haverá um exercício a ser entregue na próxima aula, dia 24.

A não entrega do exercício implicará automaticamente em ausência no dia 17.

O objetivo não é entregar algo funcionando e sim demonstrar que realizou as tentativas para descobrir como é que funciona a API javax.swing do Java.

Itens a serem trabalhados:
  1. Criar um projeto no NetBeans para construção de uma interface gráfica padrão.
  2. Itens da interface gráfica:
  • Tela de Login, utilizando JFrame;
  • Tela de Menu Principal, utilizando JFrame;
  • Tela de cadastro de usuário, utilizando JDialog.
A ideia é fazer com que ao ser executado, o programa abra automaticamente a tela de Login e ao clicar no botão "Login", o sistema feche esta tela de login e abra a tela de Menu Principal. Esta tela, por sua vez, terá um JMenuBar com pelo menos uma opção: Cadastro de Usuários. Ao clicar nesta opção, a tela de cadastro de usuários deve ser apresentada em formato Modal=TRUE.

Campos necessários na tela de cadastro de usuários:
  • Login: JTextField e JLabel
  • Senha: JPasswordTextField
  • Adm: JComboBox [com as opções "Sim" e "Não"]
  • Sexo: JRadioButton [com as opções "Masculino" e "Feminino"]
  • Funcionário: JCheckbox [com as opções "Sim" e "Não"]
  • Lista: JTable [com as colunas "Login" e "Adm"]
  • Botões "Novo", "Salvar" e "Excluir": JButton
Bom, se quiserem utilizar outros objetos da API javax.swing, sintam-se à vontade.

O objetivo é apresentar uma tela para que possamos na sequencia criar um software de cadastro de usuários e que faça login no sistema.

Boa sorte!!!

terça-feira, 3 de agosto de 2010