Envio de email html com imagem no corpo [Apache Commons Email].

Olá programadores!

Minha intenção é trazer artigos com temas de necessidades real, para que sirva no seu dia-a-dia, espero que gostem deste exemplo, criado especialmente para o Blog.
Abaixo um link do exemplo completo, faço uso da biblioteca mail.jar da Oracle, projeto foi feito no eclipse IDE.
SampleEmailWithImage

Para importar o projeto do repositório Github no eclipse, segue link de video aula:
Video Aula Git

O exemplo contem somente uma classe com método main, está bem simples e otimizado o código.

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.HtmlEmail;

/**
 * Sample send email with image and hiperlink.
 * For more samples in : http://commons.apache.org/proper/commons-email/userguide.html
 * 
 * @author Roberto Silva
 * criado em: 07/04/2014
 */
public class Principal {

	public static void main(String[] args) {		
		try {
			// Create the email message
			HtmlEmail email = new HtmlEmail();
			
			File file1=new File("./Commons Email - Examples.pdf");
			List<File> files=new ArrayList<File>();
			files.add(file1);
			
			if(files.size() > 0){
				//sending one or more attachments
				EmailAttachment attachment = new EmailAttachment(); 
				attachment.setDisposition(EmailAttachment.ATTACHMENT);

				//for each in files
				for(File fileIn:files){
					if(fileIn != null && fileIn.isFile()){
						int indexOfExtension=fileIn.getName().indexOf(".");
						indexOfExtension=indexOfExtension == -1 ? 0 :indexOfExtension;
						attachment.setDescription(fileIn.getName().substring(indexOfExtension));//extenção
						attachment.setName(fileIn.getName());	  
						attachment.setURL(fileIn.toURI().toURL());//set file local, convert in URL
						email.attach(attachment);
					}
				}
			}
			
			//show log
			email.setDebug(true);
			//set port
			email.setSmtpPort(587);  
			//check this rules for security
			email.setStartTLSEnabled(true);
			//email.setSSLCheckServerIdentity(true);

			email.setHostName("smtp.live.com");//server SMTP for Hotmail, alter other
			email.setAuthentication("yourEmail@hotmail.com", "yourPassword");
			email.setFrom("yourEmail@hotmail.com", "yourName");

			//destiny's
			email.addTo("yourDestinyEmail1", "yourDestinyName1");
			email.addTo("yourDestinyEmail2", "yourDestinyName2");
			email.addTo("yourDestinyEmail3", "yourDestinyName3");

			email.setSubject("Test email html with image and file attachment");

			//put the format to recognize the image,
			//the reason for not accepting all image formats
			String cid = email.embed(new File("./Apache_logo.gif"));

			//html text
			String txtHtml=
					"<html>"
							+ "Hello,<br><br>"
							+ "This one test for send email with image,<br>"
							+ "thanks for cooperate.<br><br>"
							+ "<a href=\"https://solutionbto.wordpress.com/\">"
							+ "<img src=\"cid:"+cid+"\">"
							+ "</a>"
							+ "</html>";

			// set the html message
			email.setHtmlMsg(txtHtml);
			// send the email
			email.send();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Espero que seja útil, para cada email exige um tipo de configuração, verifique as configurações do servidor de saída SMTP do email que irá usar, se criar forem criar um projeto para mala direta, há servidores de email que bloqueiam após passar determinada quantidade de envios.

Até o próximo post, obrigado pela visita!

Criando CellRenderer para formatação de colunas na JTable

Olá programadores!

Há momentos que precisamos exibir os dados formatados na JTable, por exemplo para valor monetário, percentual, decimal com 3 casas decimais (ideal para medidas pesadas KG), data, hora dentre outros.

Vamos direito ao código, nele há comentários onde se torna autoexplicativo, este exemplo é composto por 2 classes de controle e uma classe visual, mostrarei somente alguns trechos da classe visual, onde é setado a configuração da JTable.

Para seguir com este tutorial é necessário conhecimento no post anterior sobre criação de jtable e/ou table model.

import java.text.Format;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author  Roberto Silva 
 * @brief 	classe é responsável pela formatação de data, hora
 */
public class FormatRenderer extends DefaultTableCellRenderer {

    private Format formatter;

    /*
     * No construtor da classe é passado o formato
     */
    public FormatRenderer(Format formatter) {
        this.formatter = formatter;
    }

    public void setValue(Object value) {
        //  setando o formato do cellrenderer
        try {
            if (value != null) {
                value = formatter.format(value);
            }
        } catch (IllegalArgumentException e) {
        }
        super.setValue(value);
    }

	/**
     *  método retorna formato para data
     */
    public static FormatRenderer getDateRenderer() {
        return new FormatRenderer(new SimpleDateFormat("dd/MM/yyyy"));
    }
    
    /**
     *  método retorna formato para data e hora
     */
    public static FormatRenderer getDateTimeRenderer() {
        return new FormatRenderer(DateFormat.getDateTimeInstance());
    }

    /**
     *  método retorna formato para hora
     */
    public static FormatRenderer getTimeRenderer() {
		//linha comentada é um formato de horario mais completo
        //return new FormatRenderer(DateFormat.getTimeInstance());
		return new FormatRenderer(new SimpleDateFormat("HH:mm"));
    }
}

import java.text.NumberFormat;
import javax.swing.SwingConstants;

/**
 * @author  Roberto Silva 
 * @brief 	classe é responsável pela formatação de dados numéricos
 */
public class NumberRenderer extends FormatRenderer {
    
    /*
     * No construtor da classe é passado o formato e setado o alinhamento á direta
     */
    public NumberRenderer(NumberFormat formatter) {
        super(formatter);
        setHorizontalAlignment(SwingConstants.RIGHT);
    }

    /**
     *  método retorna formato monetário
     */
    public static NumberRenderer getCurrencyRenderer() {
        return new NumberRenderer(NumberFormat.getCurrencyInstance());
    }

    /**
     *  método retorna formato inteiro
     */
    public static NumberRenderer getIntegerRenderer() {
        return new NumberRenderer(NumberFormat.getIntegerInstance());
    }

    /**
     *  método retorna formato percentual
     */
    public static NumberRenderer getPercentRenderer() {
        return new NumberRenderer(NumberFormat.getPercentInstance());
    }
	
	/**
     * usar para formatação numerica, com definição de casas decimais
     * @return 
     */
    public static NumberRenderer getNumberRenderer(int fraction) {
        NumberFormat nf=NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(fraction);
        return new NumberRenderer(nf);
    }
}

Para setar o formato da coluna basta passar o TableColumnModel do JTable para o método “setTableColumnModel(TableColumnModel columnModel)”.

Abaixo código que faz a chamada ao método.

//variavel "table é uma instância de JTable"
//seleciona somente uma linha, caso prefira
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//desabilita tamanho dinâmico da coluna
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

//obtendo ColumnModel da JTable e setando formato
TableColumnModel columnModel = table.getColumnModel();
setTableColumnModel(columnModel);

Método responsável por setar formato e tamanho de colunas.

/**
 * seta formato e tamanho de colunas
 * @param columnModel 
 */
public void setTableColumnModel(TableColumnModel columnModel){        
	columnModel.getColumn(0).setCellRenderer(FormatRenderer.getDateTimeRenderer());
	columnModel.getColumn(1).setCellRenderer(FormatRenderer.getTimeRenderer());
	columnModel.getColumn(2).setCellRenderer(NumberRenderer.getPercentRenderer());
	columnModel.getColumn(3).setCellRenderer(NumberRenderer.getCurrencyRenderer());
        //caso queiram alterar o tamanho das colunas, setar o parâmetro setAutoResizeMode(JTable.AUTO_RESIZE_OFF); da JTable
        columnModel.getColumn(0).setPreferredWidth(150);
        columnModel.getColumn(1).setPreferredWidth(80);
        columnModel.getColumn(2).setPreferredWidth(60);
        columnModel.getColumn(3).setPreferredWidth(100);
}

Este método poderá estar em sua classe tablemodel caso prefiram, a chamada ficaria parecida com esta:
tableModel.setTableColumnModel(table.getColumnModel());

Obrigado pela visita, até o próximo post!

Fonte : http://tips4java.wordpress.com/2008/10/11/table-format-renderers/

Interface gráfica “Swing” , cálculo I.M.C

Olá  😀

Neste exemplo mostramos o uso de alguns itens do pacote Swing “javax.swing.*”,
este aplicativo tem a finalidade de calcular o Índice de Massa Corporal-IMC,
criamos 3 classe em um único arquivo “.java”, sendo:
1)GuiPrincipal = interface com usuário;
2)EventoCalculaIMC = evento para o botão calcular;
3)AplCalculaIMC = classe “Main” onde executa o aplicativo;

A seguir o código completo:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * classe é um Jframe interface com usuário
 * @author Roberto Silva
 */
class GuiPrincipal extends JFrame{
	//variaveis dos componentes
	private JTextField edtPeso;
	private JTextField edtAltura;
	private JButton btnCalcula;
	private JLabel lblPeso;
	private JLabel lblAltura;
	private JLabel lblResultado;

	/**
	 * construtor
	 */
	public GuiPrincipal(){
		//chamando metodo de configuração
		setConfig();
	}

	/**
	 * seto todas configurações do formulario
	 */
	private void setConfig() {
		//configuração do JFrame
		this.setTitle("Calcula IMC");//titulo
		this.setSize(600, 150);//tamanho do Jframe
		this.setLayout(new GridLayout(0, 2));//layout se comporta como uma tabela, mais detalhes: http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);//fecha aplicação como padrão
		this.setLocationRelativeTo(null);//centraliza o JFrame
		this.getContentPane().setBackground(Color.YELLOW);//cor de fundo é amarelo
		
		//instanciando componentes
		edtPeso=new JTextField();
		edtAltura=new JTextField();
		btnCalcula=new JButton("Calcular");
		lblPeso=new JLabel("Peso:");
		lblAltura=new JLabel("Altura:");
		lblResultado=new JLabel("Resultado: ");
		
		//add evento ao botão de calculo
		btnCalcula.addActionListener(new EventoCalculaIMC());
		
		//add componentes ao Jframe
		this.add(lblPeso);
		this.add(lblAltura);
		this.add(edtPeso);
		this.add(edtAltura);
		this.add(lblResultado);
		this.add(btnCalcula);
	}

	/**
	 * classe interna é um evento para o botão de calculo
	 * @author Roberto Silva
	 */
	class EventoCalculaIMC implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			try {

				//converte string em double
				double peso=Double.parseDouble(edtPeso.getText());
				double altura=Double.parseDouble(edtAltura.getText());
				//calcula imc
				double imc=peso/Math.pow(altura,2);

				//objeto para formatar saida, com uma decimal
				DecimalFormat df=new DecimalFormat("#0.0");

				String resultado="Resultado: "+df.format(imc);
				
				//abaixo comparo valor do imc e concatena a string resultado
				if(imc < 18.5){
					resultado+=" Abaixo do peso";
				}
				else if(imc < 24.9){
					resultado+=" Peso ideal";
				}
				else if(imc < 29.9){
					resultado+=" Levemente acima do peso";
				}
				else if(imc < 34.9){
					resultado+=" Primeiro grau de obesidade";
				}
				else if(imc < 39.9){
					resultado+=" Segundo grau de obesidade";
				}
				else
					resultado+=" Obesidade mórbida";

				//seta texto em label
				lblResultado.setText(resultado);

			}catch (ArithmeticException ar) {
				JOptionPane.showMessageDialog(null, "Erro aritmético, causa: "+ar.getMessage());
			} catch (Exception ex) {
				JOptionPane.showMessageDialog(null, "Erro desconhecido, causa: "+ex.getMessage());
			}
		}
	}

}

/**
 * classe principal onde é executado o sistema
 * @author Roberto Silva
 */
public class AplCalculaIMC {
	public static void main(String[] args) {
		//instanciando e exibindo
		new GuiPrincipal().setVisible(true);
	}
}

Ao executar…
GUI_IMC

Espero que tenha gostado, até o próximo post 😉

Criando seu modelo de tabela [AbstractTableModel]

Olá pessoal. 😀

Desculpem á ausência, faculdade está á todo vapor, rsrsrs…

Brincadeiras a parte vamos para um excelente tutorial, neste tutorial vamos aprender a criar um modelo de tabela para JTable.

Este modelo contará com métodos para sua persistência poderemos por exemplo inserir e remover linhas.

Crie um projeto no eclipse IDE , com nome SampleTableModel.

Após criar o projeto, crie a 1° classe com nome Empregado no pacote br.modelo, será o objeto Java Bean do projeto, abaixo o código completo.

package br.modelo;

import java.sql.Date;

/**
 * classe Javabean entidade Empregado
 * @author Roberto Silva
 */
public class Empregado {
	private String  nome;
	private int     idade;
	private char    sexo;
	private Date    dataNasc;
	private double  salario;
	private boolean beneficio;

	public Empregado() {
		//inicializando variaveis
		this.nome="";
		this.idade=0;
		this.sexo='M';
		this.dataNasc=new Date(new java.util.Date().getTime());
		this.salario=0;
		this.beneficio=true;
	}

	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * @return the idade
	 */
	public int getIdade() {
		return idade;
	}

	/**
	 * @param idade the idade to set
	 */
	public void setIdade(int idade) {
		this.idade = idade;
	}

	/**
	 * @return the sexo
	 */
	public char getSexo() {
		return sexo;
	}

	/**
	 * @param sexo the sexo to set
	 */
	public void setSexo(char sexo) {
		this.sexo = sexo;
	}

	/**
	 * @return the dataNasc
	 */
	public Date getDataNasc() {
		return dataNasc;
	}

	/**
	 * @param dataNasc the dataNasc to set
	 */
	public void setDataNasc(Date dataNasc) {
		this.dataNasc = dataNasc;
	}

	/**
	 * @return the salario
	 */
	public double getSalario() {
		return salario;
	}

	/**
	 * @param salario the salario to set
	 */
	public void setSalario(double salario) {
		this.salario = salario;
	}

	/**
	 * @return the beneficio
	 */
	public boolean isBeneficio() {
		return beneficio;
	}

	/**
	 * @param beneficio the beneficio to set
	 */
	public void setBeneficio(boolean beneficio) {
		this.beneficio = beneficio;
	}

}

Agora neste ponto vamos criar á nossa “Table Model” é uma classe que estende AbstractTableModel,

esta classe possui métodos de herança, após estender terá que sobreescrever alguns métodos.

Crie a 2° classe com nome EmpregadoTableModel no pacote br.modelo, abaixo o código completo.

package br.modelo;

import java.sql.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 * classe Table Model "modelo de tabela" p/entidade Empregado
 * @author Roberto Silva
 */
public class EmpregadoTableModel extends AbstractTableModel{

	//constantes p/identificar colunas
	private final int NOME=0;
	private final int IDADE=1;
	private final int SEXO=2;
	private final int DATA_NASC=3;
	private final int SALARIO=4;
	private final int BENEFICIO=5;

	private final String colunas[]={"Nome:","Idade:","Sexo:","Data.Nasc:","Salário:","Beneficio:"};
	private final List<Empregado> dados;//usamos como dados uma lista genérica de Empregado

	public EmpregadoTableModel(List<Empregado> dados) {
		//seto os dados no construtor
		this.dados=dados;
	}

	@Override
	public int getColumnCount() {
		//retorna o total de colunas
		return colunas.length;
	}

	@Override
	public int getRowCount() {
		//retorna o total de linhas na tabela
		return dados.size();
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		//retorna o tipo de dado, para cada coluna
		switch (columnIndex) {
		case NOME:
			return String.class;
		case IDADE:
			return int.class;
		case SEXO:
			return char.class;
		case DATA_NASC:
			return Date.class;
		case SALARIO:
			return double.class;
		case BENEFICIO:
			return Boolean.class;
		default:
			throw new IndexOutOfBoundsException("Coluna Inválida!!!");
		}
	}

	@Override
	public String getColumnName(int columnIndex) {
		return colunas[columnIndex];
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		//retorna o valor conforme a coluna e linha

		//pega o dados corrente da linha
		Empregado empregado=dados.get(rowIndex);

		//retorna o valor da coluna
		switch (columnIndex) {
		case NOME:
			return empregado.getNome();
		case IDADE:
			return empregado.getIdade();
		case SEXO:
			return empregado.getSexo();
		case DATA_NASC:
			return empregado.getDataNasc();
		case SALARIO:
			return empregado.getSalario();
		case BENEFICIO:
			return empregado.isBeneficio();
		default:
			throw new IndexOutOfBoundsException("Coluna Inválida!!!");
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		//metodo identifica qual coluna é editavel

		//só iremos editar a coluna BENEFICIO, 
		//que será um checkbox por ser boolean
		if(columnIndex == BENEFICIO)
			return true;

		return false;
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		Empregado empregado=dados.get(rowIndex);

		if(columnIndex == BENEFICIO){
			empregado.setBeneficio(((boolean)aValue));
		}
	}

	//Métodos abaixo são para manipulação de dados

	/**
	 * retorna o valor da linha indicada
	 * @param rowIndex
	 * @return
	 */
	public Empregado getValue(int rowIndex){
		return dados.get(rowIndex);
	}

	/**
	 * retorna o indice do objeto
	 * @param empregado
	 * @return
	 */
	public int indexOf(Empregado empregado) {
		return dados.indexOf(empregado);
	}

	/**
	 * add um empregado á lista
	 * @param empregado
	 */
	public void onAdd(Empregado empregado) {
		dados.add(empregado);
		fireTableRowsInserted(indexOf(empregado), indexOf(empregado));
	}

	/**
	 * add uma lista de empregados
	 * @param dadosIn
	 */
	public void onAddAll(List<Empregado> dadosIn) {
		dados.addAll(dadosIn);
		fireTableDataChanged();
	}

	/**
	 * remove um registro da lista, através do indice
	 * @param rowIndex
	 */
	public void onRemove(int rowIndex) {
		dados.remove(rowIndex);
		fireTableRowsDeleted(rowIndex, rowIndex);
	}

	/**
	 * remove um registro da lista, através do objeto
	 * @param empregado
	 */
	public void onRemove(Empregado empregado) {
        int indexBefore=indexOf(empregado);//pega o indice antes de apagar
        dados.remove(empregado);  
		fireTableRowsDeleted(indexBefore, indexBefore);
	}

	/**
	 * remove todos registros da lista
	 */
	public void onRemoveAll() {
		dados.clear();
		fireTableDataChanged();
	}

}

Crie a 3° classe com nome GUIPrincipal no pacote br.visual, será a classe visual,
irá fazer a interface com usuário, abaixo o código completo.

package br.visual;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

import br.modelo.Empregado;
import br.modelo.EmpregadoTableModel;

/**
 * classe JFrame "Formulário Java", U.I-User Interface
 * @author Roberto Silva
 */
public class GUIPrincipal extends JFrame{

	private JTable table=new JTable();
	private EmpregadoTableModel tableModel;

	private JButton btnAdd=new JButton("Adicionar Linha");
	private JButton btnRem=new JButton("Remover Linha");
	private JButton btnAddAll=new JButton("Adicionar Dados");
	private JButton btnRemAll=new JButton("Remover Dados");;

	public GUIPrincipal() {
		//setando respectivamente...
		//titulo
		this.setTitle("Exemplo de Table Model");
		//layout
		this.setLayout(new FlowLayout());
		//tamanho do JFrame
		this.setSize(new Dimension(600, 400));
		//tipo de fechamento da janela
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//centralizando a janela
		this.setLocationRelativeTo(null);

		//neste ponto é criado o modelo da JTable
		tableModel=new EmpregadoTableModel(getListaEmpregados());

		//setando propriedades da tabela...

		//modelo
		table.setModel(tableModel);
		//barra de rolagem
        table.setPreferredScrollableViewportSize(new Dimension(500,300));
        //auto ajuste na altura da tabela
        table.setFillsViewportHeight(true);
        //selecionar somente uma linha
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        //add a table ao scroll pane
		JScrollPane scrollPane=new JScrollPane(table);
		this.add(scrollPane);

		//add eventos aos botões
		btnAdd.addActionListener(btnAddListener);
		btnRem.addActionListener(btnRemListener);
		btnAddAll.addActionListener(btnAddAllListener);
		btnRemAll.addActionListener(btnRemAllListener);

		//add botões ao JFrame
		this.add(btnAdd);
		this.add(btnRem);
		this.add(btnAddAll);
		this.add(btnRemAll);
	}

	/**
	 * retorna uma lista de empregados
	 * @return {@link List} {@link Empregado}
	 */
	private List<Empregado> getListaEmpregados(){
		//criado lista e seu conteudo os empregados
		//setando suas propriedades
		List<Empregado> empregados=new ArrayList<Empregado>();

		Empregado emp1=new Empregado();
		emp1.setNome("Jack");
		emp1.setIdade(19);
		emp1.setSexo('M');
		emp1.setSalario(2500);

		Empregado emp2=new Empregado();
		emp2.setNome("Eddie");
		emp2.setIdade(56);
		emp2.setSexo('M');
		emp2.setSalario(7500);

		Empregado emp3=new Empregado();
		emp3.setNome("Gina");
		emp3.setIdade(34);
		emp3.setSexo('F');
		emp3.setSalario(5500);

		Empregado emp4=new Empregado();
		emp4.setNome("Klaus");
		emp4.setIdade(18);
		emp4.setSexo('M');
		emp4.setSalario(1500);

		Empregado emp5=new Empregado();
		emp5.setNome("Erick");
		emp5.setIdade(20);
		emp5.setSexo('F');
		emp5.setSalario(1600);

		Empregado emp6=new Empregado();
		emp6.setNome("Robert");
		emp6.setIdade(30);
		emp6.setSexo('M');
		emp6.setSalario(4500);

		Empregado emp7=new Empregado();
		emp7.setNome("Mary");
		emp7.setIdade(30);
		emp7.setSexo('F');
		emp7.setSalario(4500);

		//add á lista os empregados criados
		empregados.add(emp1);
		empregados.add(emp2);
		empregados.add(emp3);
		empregados.add(emp4);
		empregados.add(emp5);
		empregados.add(emp6);
		empregados.add(emp7);

		return empregados;
	}

	/*
	 * Eventos do botões, poderia ser criado classes que fossem "extends ActionListener"
	 * mas como se trata de um exemplo, vamos simplificar 😉
	 * */

	//evento p/adicionar um registro á tabela
	private ActionListener btnAddListener=new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			//sorteia um indice do tamanho da lista para baixo
			//exemplo se a lista tiver o tamanho 10 , então vai de 0 até 9
			int randomIndex=(int)(Math.random()* (tableModel.getRowCount()-1));
			Empregado empregado=tableModel.getValue(randomIndex);
			tableModel.onAdd(empregado);
		}
	};

	//evento p/remover um registro da tabela
	private ActionListener btnRemListener=new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			if(table.getSelectedRow() != -1 && table.getSelectedRow() < tableModel.getRowCount()){
				tableModel.onRemove(table.getSelectedRow());
			}else
				JOptionPane.showMessageDialog(null, "Selecione um registro da tabela!");
		}
	};

	//evento p/adicionar um vários registros á tabela
	private ActionListener btnAddAllListener=new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			tableModel.onAddAll(getListaEmpregados());
		}
	};

	//evento p/remover vários registros á tabela
	private ActionListener btnRemAllListener=new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			tableModel.onRemoveAll();
		}
	};
}

Crie a 4° e última classe com nome Main no pacote br.visual, será a classe principal do projeto, onde tem o método main(…),abaixo o código completo.

package br.visual;

/**
 * classe Principal, onde é executado o sistema
 * @author Roberto Silva
 */
public class Main {
	public static void main(String[] args) {
		//instanciou
		GUIPrincipal principal=new GUIPrincipal();
		//tornou visivel
		principal.setVisible(true);
	}
}

Após o termino execute a classe Main do projeto, teremos este resultado…

JTable com model do tipo AbstractTableModel

Polpei comentários no post,  pois o código está bem comentado, em breve adiciono comentários se necessário.

Fique a vontade para deixar seu comentário em caso de dúvida, sugestão ou crítica.

Download do projeto neste link.

Exemplo modificado com eventos separados em classes Listeners neste link

Obrigado pela visita e até o próximo post. 😉

Criando classe de conexão Java – Parte 2 [MVC+JDBC+CRUD]

Olá 😀

Este post é uma continuação do post anterior, nele irei exemplificar uma arquitetura MVC com C.R.U.D – [CREATE,READ,UPDATE,DELETE].
Cada classe será responsável unicamente por sua tarefa, seguindo o padrão singleton.

Teremos a seguinte estrutura:
ScreenHunter_03 Jul. 05 20.51

Esta é a tabela que precisamos criar no banco de dados:

--execute este DDL, antes de executar o programa
CREATE TABLE EMPREGADO(
	ID   	 NUMBER(8),
	CONSTRAINT ID_PK PRIMARY KEY(ID),
	NOME 	 VARCHAR(30),
	DAT_NASC DATE,
	SALARIO  NUMBER(15,2)
);

COMMIT WORK;

Vamos criar os pacotes, aperte a combinação [CTRL+N] digite package ou vá na aba Java > package, crie os pacotes:
br.modelo
br.visual

No pacote br.modelo aperte a combinação [CTRL+N], digite class ou vá na aba Java > class, coloque o nome de Empregado, esta classe é do tipo padrão chamado JavaBeans
Primeiro escreva a classe e seus atributos:

package br.modelo;

import java.sql.Date;

/**
 * classe Bean tem os campos da entidade EMPREGADO
 * @author Roberto Silva
 *
 */
public class Empregado {
	private int id;
	private String nome;
	private Date dat_nasc;
	private double salario;
}

Agora vamos gerar os métodos, clique com botão direito do mouse sobre a classe, siga para Source > Generate Getters and Setters, selecione todos atributos [OK].

Após isto iremos criar o método toString(), ele irá exibir o nosso Empregado de forma legível, siga para Source > Generate toString() [OK].

Após estes processos teremos os seguinte resultado:

package br.modelo;

import java.sql.Date;

/**
 * classe Bean tem os campos da entidade EMPREGADO
 * @author Roberto Silva
 *
 */
public class Empregado {
	private int id;
	private String nome;
	private Date dat_nasc;
	private double salario;
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	/**
	 * @return the date
	 */
	public Date getDat_nasc() {
		return dat_nasc;
	}
	/**
	 * @param date the date to set
	 */
	public void setDat_nasc(Date dat_nasc) {
		this.dat_nasc = dat_nasc;
	}
	/**
	 * @return the salario
	 */
	public double getSalario() {
		return salario;
	}
	/**
	 * @param salario the salario to set
	 */
	public void setSalario(double salario) {
		this.salario = salario;
	}

	/* (non-Javadoc) - exibe os atributos de Empregado
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return " id=" + id + ", nome=" + nome + ", dat_nasc="
				+ dat_nasc + ", salario=" + salario + " \n ";
	}
}

Agora vamos criar a classe responsável pela persistência dos dados em Empregado,
ficará no pacote br.modelo e chama-se EmpregadoDAO.Esta classe é do tipo DAO-Data Acess Object.

package br.modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.controle.AcessoBD;

/**
 * classe faz a persistencia com a entidade EMPREGADOS do ORACLE
 * @author Roberto Silva
 * criado em: 04/07/2013
 */
public class EmpregadoDAO {

	private Connection conn;
	private PreparedStatement pstm;
	private ResultSet rs;

	private final String SELECT=" SELECT * FROM EMPREGADO ";
	private final String INSERT=" INSERT INTO EMPREGADO(ID,NOME,DAT_NASC,SALARIO)VALUES(?,?,?,?) ";
	private final String UPDATE=" UPDATE EMPREGADO SET NOME=?,DAT_NASC=?,SALARIO=? WHERE ID=? ";
	private final String DELETE=" DELETE FROM EMPREGADO WHERE ID=? ";

	/**
	 * metodo seleciona registros de EMPREGADO
	 * @param nome
	 * @return
	 * @throws Exception
	 */
	public List selecionar(){
		List empregados=new ArrayList();
		Empregado emp=null;
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(SELECT);
			rs=pstm.executeQuery();

			while(rs.next()){
				emp=new Empregado();
				emp.setId(rs.getInt("id"));
				emp.setNome(rs.getString("nome"));
				emp.setDat_nasc(rs.getDate("dat_nasc"));
				emp.setSalario(rs.getDouble("salario"));

				empregados.add(emp);
			}

		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}

		return empregados;
	}

	/**
	 * faz a inserção de EMPREGADO
	 * @param empregado
	 * @throws Exception
	 */
	public void inserir(Empregado emp){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(INSERT);
			pstm.setInt(1, emp.getId());
			pstm.setString(2, emp.getNome());
			pstm.setDate(3, emp.getDat_nasc());
			pstm.setDouble(4, emp.getSalario());

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}

	/**
	 * faz a atualização de EMPREGADO
	 * @param empregado
	 * @throws Exception
	 */
	public void atualizar(Empregado emp){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(UPDATE);
			pstm.setString(1, emp.getNome());
			pstm.setDate(2, emp.getDat_nasc());
			pstm.setDouble(3, emp.getSalario());
			pstm.setInt(4, emp.getId());

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}

	/**
	 * faz a exclusão de Empregado
	 * @param id
	 * @throws Exception
	 */
	public void excluir(int id){
		try {
			conn=AcessoBD.conectar();
			pstm=conn.prepareStatement(DELETE);
			pstm.setInt(1, id);

			pstm.executeUpdate();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro, causa:"+e.getMessage());
			e.printStackTrace();
		}finally{
			AcessoBD.desconectar(conn, pstm, rs);
		}
	}
}

E por último temos a classe visual, que será criada no pacote br.visual, o nome dela será Principal:

package br.visual;

import java.sql.Date;
import java.text.SimpleDateFormat;

import br.modelo.Empregado;
import br.modelo.EmpregadoDAO;

/**
 * classe onde executa o programa
 * @author Roberto Silva
 *
 */
public class Principal {
	public static void main(String[] args) throws Exception{
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		EmpregadoDAO empDao=new EmpregadoDAO();

		Empregado emp1=new Empregado();
		Empregado emp2=new Empregado();
		Empregado emp3=new Empregado();

		//setando o empregado 1
		emp1.setId(1);
		emp1.setNome("Roberto");
		emp1.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp1.setSalario(5500.45);

		//setando o empregado 2
		emp2.setId(2);
		emp2.setNome("Katia");
		emp2.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp2.setSalario(4500.50);

		//setando o empregado 3
		emp3.setId(3);
		emp3.setNome("Rose");
		emp3.setDat_nasc(new Date(sdf.parse("1983-08-12").getTime()));
		emp3.setSalario(6500.50);

		//inserindo
		empDao.inserir(emp1);
		empDao.inserir(emp2);
		empDao.inserir(emp3);

		//exibe os dados após a inserção
		System.out.println("Inserção:\n"+empDao.selecionar());

		//alterando os salarios, tiveram um aumento 🙂
		emp1.setSalario(6000.70);
		emp2.setSalario(5000.50);
		emp3.setSalario(7000.70);

		//atualizando os dados
		empDao.atualizar(emp1);
		empDao.atualizar(emp2);
		empDao.atualizar(emp3);

		//exibe os dados após a atualização
		System.out.println("Alteração do sálario:\n"+empDao.selecionar());

		//coloca em um array de Empregado
		Empregado []emps={emp1,emp2,emp3};

		//for each irá exclui um a um empregado do array
		for(Empregado empIn:emps)
		empDao.excluir(empIn.getId());

		System.out.println("Exclusão, total de registros :"+empDao.selecionar().size());
	}
}

Código simples e bem comentado, procurei deixar de maneira que fique “auto-explicativo”.
Execute o programa com banco de dados levantado.
A saída será:
ScreenHunter_02 Jul. 05 20.35

Github:clique aqui
Download do projeto:clique aqui

Obrigado pela visita, até mais 😉

Criando classe de conexão Java – Parte 1.

Olá.

Neste post iremos criar uma classe de conexão java.
Esta classe fará leitura de um arquivo de propriedades, nele conterá todo parâmetro para conexão.

Desta maneira não teremos acomplamento a um tipo de banco de dados, ou seja ,
não será necessário escrever na própria classe “hard code” a conexão com o banco de dados.

Obs:Se quiser seguir o tutorial a risca faça os downloads, senão ignore os passos seguintes e use o banco de dados que melhor servir, juntamente com seu driver JDBC.Depois é só editar o arquivo de propriedades que iremos criar.
1°)Faça os seguintes downloads, caso não possua estes arquivos:
Oracle Express 11g
ojdbc14.jar
Obs:o arquivo ojdbc14.jar ou qualquer outro driver jdbc,deve ser colocado na raiz do projeto, que iremos criar.
Clique em aceitar, para liberar o download e siga os procedimentos…
ScreenHunter_01 May. 26 00.15
2°)Após baixar os arquivos instale o Oracle Express 11g, que será nosso banco de dados, para este exemplo.
Siga os assistente de instalação, quando pedir uma senha digite “Tiger”, essa senha será do usuário SYSTEM que é o usuário padrão do Oracle.
Em caso de dúvida, segue um link com um video tutorial:
Instalação Oracle 11g

Abra o eclipse crie um novo projeto “Java Project“, aperte a combinação [CTRL+N], em “Project name” coloque ConexaoJDBC.

Novo projeto

Selecione o projeto, clique com botão direito do mouse e siga p/ Buid Path > Configure Build Path.
Como na imagem abaixo…
build path
Clique em [Add External Jars], e adicione o arquivo ojdbc14.jar ou o driver JDBC de sua preferência, após isso clique em [OK].

Após este passo, criaremos a classe de conexão Java, aperte a combinação [CTRL+N], o arquivo é do tipo Class.
Nome da classe “Name” será “AcessoBD” e no pacote “package” coloque “br.controle”.

ScreenHunter_01 Jun. 09 20.30

Agora que foi criado a classe e o pacote, teremos que criar os métodos da classe, conectar e desconectar.
Digite conforme o código abaixo ou copie e cole.


package br.controle;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
*
* @author Roberto Silva
*/
public class AcessoBD{

    public static Connection conectar() throws Exception {
        Connection connection = null;
        String driver = "";
        String usuario = "";
        String senha = "";
        String url = "";
        String banco = "";

        //so renomear se precisar do outro properties
        File prop_file = new File(new File("").getAbsolutePath() + "/jdbc.properties");

        if (!prop_file.isFile()) {
            throw new Exception("Não achou a arquivo de propriedade, caminho:" + prop_file.getAbsolutePath() + " , errado.");
        }

        Properties properties = new Properties();
        //Setamos o arquivo que será lido
        FileInputStream fis = new FileInputStream(prop_file.getAbsolutePath());

        //método load faz a leitura através do objeto fis
        properties.load(fis);

        //Captura o valor da propriedade, através do nome da propriedade(Key)
        usuario = properties.getProperty("jdbc.user");
        senha = properties.getProperty("jdbc.pass");
        driver = properties.getProperty("jdbc.driver");
        url = properties.getProperty("jdbc.url");
        banco = properties.getProperty("jdbc.dataBase");

        Class.forName(driver);

        connection = DriverManager.getConnection(url + banco, usuario, senha);

        return connection;
    }

    //sobrecarga dos metodo desconectar,
    //na sobrecarga muda somente a assinatura dos metodos ou seja os parâmetros
    public static void desconectar(Connection conn) {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();
        }
    }

    public static void desconectar(Connection conn, PreparedStatement pstm) {
        try {
            if (pstm != null) {
                pstm.close();
            }

            if (conn != null) {
                conn.close();
            }

        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();
        }
    }

    public static void desconectar(Connection conn, PreparedStatement pstm, ResultSet rs) {
        try {

            if (rs != null) {
                rs.close();
            }

            if (pstm != null) {
                pstm.close();
            }

            if (conn != null) {
                conn.close();
            }

        } catch (Exception e) {
            System.out.println("Exceção, causa:" + e.getClass());
            e.printStackTrace();

        }
    }
}

Como podemos observar o método conectar(), retornará um objeto do tipo java.sql.Connection,este objeto é da API JDBC, para uso do SQL.Também que fará leitura de um arquivo de propriedades,conforme este trecho:

 FileInputStream fis = new FileInputStream(prop_file.getAbsolutePath());

Vamos criá-lo neste momento, aperte a combinação [CTRL+N] para criar um novo arquivo, na árvore General, siga para o tipo File aperte [Next]. O nome do arquivo será “jdbc.properties”.

general_file
Digite o conteúdo abaixo.

#parametros de conexao com banco.
jdbc.dataBase=XE
jdbc.url=jdbc:oracle:thin:@localhost:1521:
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.user=SYSTEM
jdbc.pass=Tiger

No próximo post iremos criar uma tabela no Oracle e testar a persistência com o banco de dados.

Obrigado pela visita.Até o próximo post.

Simples tabela Java na IDE Eclipse – JTable

Olá pessoal!

Neste post abordaremos como criar uma JTable “Tabela”, esta por sua vez é uma API Java.

Abra a IDE Eclipse, crie um novo projeto Java, nomeie de MyJTable.

Crie uma classe Java chamada de GuiPrincipal.

  public class GuiPrincipal{
  }

Após o nome da classe “GuiPrincipal” digite: “extends JFrame”, importe as API’s abaixo:

  import java.awt.Dimension;
  import java.awt.FlowLayout;
  import javax.swing.JFrame;
  import javax.swing.JScrollPane;
  import javax.swing.JTable;

  public class GuiPrincipal extends JFrame{
  }

Esta classe extende de JFrame é uma API Java é semelhante a um “formulário”.Colocaremos nossa JTable neste “formulário”.

Abaixo o código completo comentado.


import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class GuiPrincipal extends JFrame{
	
        //variaveis para uso da JTable 
	private JTable table;
	private final String colunas[]={"Nome:","Idade:","Sexo:"};
	private final String dados[][]={
			{"Jack","19","Masculino"},
			{"Eddie","56","Masculino"},
			{"Gina","34","Feminino"},
			{"Klaus","18","Masculino"},
			{"Erika","20","Feminino"},
			{"Roberto","29","Masculino"},
			{"Maria","30","Feminino"}};
	
        /*Construtor da classe ,
          antes de executar o metodo main(),
          irá construir o JFrame e a JTable*/
	public GuiPrincipal() {
		setLayout(new FlowLayout());//tipo de layout
		setSize(new Dimension(600, 200));//tamanho do Formulario
		setLocationRelativeTo(null);//centralizado
		setTitle("Exemplo JTable");//titulo
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setando a ação padrão de fechamento do Formulário,
                                                               // neste caso  irá fechar o programa
		
                //instanciando a JTable
		table=new JTable(dados,colunas);
		table.setPreferredScrollableViewportSize(new Dimension(500,100));//barra de rolagem
		table.setFillsViewportHeight(true);
		
                //adicionando a tabela em uma barra de rolagem, ficará envolta , pela mesma 
		JScrollPane scrollPane=new JScrollPane(table);
                
                //adicionando ao JFrame "Formulário" a JTable "Tabela" 
		add(scrollPane);
	}
	
        //este é o método onde é executado nosso programa
	public static void main(String[] args) {
		new GuiPrincipal().setVisible(true);
	}
	
}

jtable

Até o próximo post, obrigado pela visita! 🙂

Sobrecarga “Overload”.

Olá pessoal!

Neste post iremos criar uma classe, com métodos em sobrecarga.A sobrecarga é muito usada, como por exemplo em uma classe de conexão com Banco de Dados “Connection Factory”.

Ela se caracteriza quando temos um método com mesmo nome só mudamos a assinatura ou seja os parâmetros, por exemplo:

public class Teste1 {

	static boolean testeTipo(Object object){
		System.out.print("is Object  : ");
		return object instanceof Object;
	}

	static boolean testeTipo(String string){
		System.out.print("is String  : ");
		return string instanceof String;
	}

	static boolean testeTipo(Number number){
		System.out.print("is Number  : ");
		return number instanceof Number;
	}

	static boolean testeTipo(Double doub){
		System.out.print("is Double  : ");
		return doub instanceof Object;
	}

	static boolean testeTipo(Integer integer){
		System.out.print("is Integer : ");
		return integer instanceof Integer;
	}

	public static void main(String[] args) {
		
		System.out.println(testeTipo(15));
		System.out.println(testeTipo(10.5));
		System.out.println(testeTipo(new StringBuffer("Hello Word")));
		System.out.println(testeTipo(15l));
		System.out.println(testeTipo("solutionbto.wordpress.com"));

	}
}

Ao executar irá perceber que invoca o metodo mais genérico ou seja compatível com argumento passado.

Até o próximo post, obrigado pela visita!