ads

sábado, 24 de janeiro de 2009

Código para excluir uma coluna de uma JTable em tempo de execução

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.util.*;


public class Estudos extends JFrame{
public Estudos(){
super("Exemplo de uma tabela simples");

final DefaultTableModel modelo = new MyDefaultTableModel();

// constrói a tabela
final JTable tabela = new JTable(modelo);
tabela.setAutoCreateColumnsFromModel(false);

// Cria duas colunas
modelo.addColumn("Nome");
modelo.addColumn("Idade");

JButton btn = new JButton("Inserir Colunas");
btn.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
String titulo = JOptionPane.showInputDialog(null,
"Informe o título para a nova coluna:");
int pos = Integer.parseInt(JOptionPane.showInputDialog(null,
"Informe a posição da nova coluna:"));

// testa se a posição é válida
if(pos > (modelo.getColumnCount() - 1))
pos = 0;

// Insere uma coluna na posição especificada
insertColumn(tabela, titulo, null, pos);
}
}
);

JButton btn2 = new JButton("Excluir Colunas");
btn2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
int pos = Integer.parseInt(JOptionPane.showInputDialog(null,
"Informe a posição da coluna a ser excluída:"));

// testa se a posição é válida
if(pos < modelo.getColumnCount())
// remove a coluna na posição especificada
removeColumnAndData(tabela, pos);
}
}
);

tabela.setPreferredScrollableViewportSize(new Dimension(350, 50));

Container c = getContentPane();
c.setLayout(new FlowLayout());

JScrollPane scrollPane = new JScrollPane(tabela);
c.add(scrollPane);
c.add(btn);
c.add(btn2);

setSize(400, 300);
setVisible(true);
}

public void betterAddColumn(JTable table, Object headerLabel,
Object[] values) {
DefaultTableModel model = (DefaultTableModel)table.getModel();
TableColumn col = new TableColumn(model.getColumnCount());

if(table.getAutoCreateColumnsFromModel()) {
throw new IllegalStateException();
}
col.setHeaderValue(headerLabel);
table.addColumn(col);
model.addColumn(headerLabel.toString(), values);
}

public void insertColumn(JTable table, Object headerLabel,
Object[] values, int vColIndex){
betterAddColumn(table, headerLabel, values);
table.moveColumn(table.getColumnCount()-1, vColIndex);
}

public void removeColumnAndData(JTable table, int vColIndex) {
MyDefaultTableModel model = (MyDefaultTableModel)table.getModel();
TableColumn col = table.getColumnModel().getColumn(vColIndex);
int columnModelIndex = col.getModelIndex();
Vector data = model.getDataVector();
Vector colIds = model.getColumnIdentifiers();

table.removeColumn(col);

colIds.removeElementAt(columnModelIndex);

for (int r=0; rVector row = (Vector)data.get(r);
row.removeElementAt(columnModelIndex);
}
model.setDataVector(data, colIds);

Enumeration enume = table.getColumnModel().getColumns();
for (; enume.hasMoreElements(); ) {
TableColumn c = (TableColumn)enume.nextElement();
if (c.getModelIndex() >= columnModelIndex) {
c.setModelIndex(c.getModelIndex()-1);
}
}
model.fireTableStructureChanged();
}

public static void main(String args[]){
Estudos app = new Estudos();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyDefaultTableModel extends DefaultTableModel {
public Vector getColumnIdentifiers() {
return columnIdentifiers;
}
}

Mask Formatter in Java

The Java 2 Standard Edition (J2SE), version 1.4 add the Swing component JFormattedTextField. With this component it's possible build formatted fields like telephone, date, CPF, etc...

The DefaultFormatterFactory component comes with preinstalled formatters for dates, numbers, java.text.Format subclasses.

Configuring acceptable input

Masked input is typically configured by using an instance of the MaskFormatter class. Found in the javax.swing.text package, MaskFormatter works by using a series of characters to designate acceptable input. Each of the eight characters in the series represents one character in the input, as listed below:

# - A number
? - A letter
A - A letter or number
* - Anything
U - A letter, with lowercase characters mapped to their uppercase equivalents
L - A letter, with uppercase characters mapped to their lowercase equivalents
H - A hexadecimal digit (A-F, a-f, 0-9)
' - Used to escape another mask character

In addition to MaskFormatter, you can use the DateFormat and NumberFormat classes from the java.text package to specify the input format. Listing 1 shows some possible formats.

// Four-digit year, followed by month name and day of month,
// each separated by two dashes (--)
DateFormat format =
new SimpleDateFormat("yyyy--MMMM--dd");
DateFormatter df = new DateFormatter(format);
// US Social Security number
MaskFormatter mf1 =
new MaskFormatter("###-##-####");
// US telephone number
MaskFormatter mf2 =
new MaskFormatter("(###) ###-####");


Once you've specified the input format, you would then pass the formatter into the JFormattedTextField constructor, as shown below:

JFormattedTextField ftf1 = new
JFormattedTextField(df);

Depending on the formatter used, there are other configurable options. For instance, with MaskFormatter, you can set the placeholder character with setPlaceholderCharacter(char). Also, for date fields, it helps if you initialize the field to some value so a user will know what input format is acceptable.


Example:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.util.*;
import java.text.*;
public class FormattedSample {
public static void main (String args[]) throws ParseException {
JFrame f = new JFrame("JFormattedTextField Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = f.getContentPane();
content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));
// Four-digit year, followed by month name and day of month,
// each separated by two dashes (--)
DateFormat format =
new SimpleDateFormat("yyyy--MMMM--dd");
DateFormatter df = new DateFormatter(format);
JFormattedTextField ftf1 = new
JFormattedTextField(df);
ftf1.setValue(new Date());
content.add(ftf1);
// US Social Security number
MaskFormatter mf1 =
new MaskFormatter("###-##-####");
mf1.setPlaceholderCharacter('_');
JFormattedTextField ftf2 = new
JFormattedTextField(mf1);
content.add(ftf2);
// US telephone number
MaskFormatter mf2 =
new MaskFormatter("(###) ###-####");
JFormattedTextField ftf3 = new
JFormattedTextField(mf2);
content.add(ftf3);
f.setSize(300, 100);
f.show();
}
}

Source: IBM, SUN

segunda-feira, 12 de janeiro de 2009

GMaps4JSF

GMaps4JSF visa a integração do Google Maps com JavaServer Faces.

Usuários da tecnologia JSF serão capazes de construir complexas StreetViewPanoramas e mapas com apenas algumas tags JSF.

GMaps4JSF é uma biblioteca de mashups que permite aos desenvolvedores contruírem aplicações em JSF facilmente.

Algumas novidades para a nova versão:
* Ícone para simplificar o marcador de imagem personalizado
* Agora é permitido adicionar notas ao componente de marcador
* Suporte a Facelets
* Bugs resolvidos da versão 1.1.0

Fonte: Theserverside.com

segunda-feira, 1 de dezembro de 2008

Óptimo site sobre viagens!

Visitem o recém inaugurado site sobre viagens pelo mundo!

http://viajantesmundo.blogspot.com/


O objectivo do http://viajantesmundo.blogspot.com/ é auxiliar a todos que desejam viajar ao redor do mundo, mantendo o viajante bem informado.

A estrutura do site é a seguinte:
-> Do lado direito encontram-se links patrocinados pelo Google, que oferecem os produtos e serviços que melhor lhe atendem.
->Logo abaixo dos anúncios, há uma lista de blogs recomendados e um pouco mais abaixo uma imagem diferente e surpreendente fornecida diariamente pelo National Geographic POD!
-> Abaixo do campo de mensagens postadas há um textfield com notícias de vários países do mundo (temas como economia, política, esportes, viagem e imigração, empresas, etc) . Abaixo há mais uma propaganda.

Click e confira!

domingo, 16 de novembro de 2008

Cases de Sucesso de Empresas que optaram por Arquiteturas Orientadas por Serviço (SOA)

1. Comcast
Uma das maiores (se não a maior) operadora de TV a cabo dos EUA. Eis a sua abordagem:
Se preocuparam inicialmente com a arquitetura e não em comprar ESB
Depois de desenvolver a arquitetura, o foco foi o framework de governança para implementação e gestão dos novos serviços
Direcionou os esforços iniciais de SOA para o legado (e.g. billing)
Tempo de maturação do projeto: 18 meses
Lições aprendidas: “…a Comcast deveria ter desenvolvido um modelo de serviço de dados comum depois de definir a arquitetura. Sem serviços de dados padrões para acessar informação corporativa e gerenciar interações entre sistemas, os desenvolvedores acabaram projetando seus serviços para executar o trabalho de diferentes maneiras, o que gerou inconsistências, quebrando a promessa de SOA de possibilitar um mix fácil de componentes de serviços“


2. Leapfrog
Uma das mais conhecidas fabricantes de brinquedos educativos.
Cenário: vários sistemas e soluções em Java 5 e 6, C# da Microsoft e web services com diversas bibliotecas de terceiros
Objetivo: maior reutilização de código, desenvolvimento mais veloz e integração mais fácil; mas a empresa não queria limitar a iniciativa SOA a uma mudança da guarda de ferramentas de desenvolvimento e plataformas de integração
Abordagem: POJO, ESB Open-source (Mule), utilização de 2 (dois) ESBs - um para gerenciar fluxo de dados e outro para aplicações Web (Portal do cliente)
Por que o Mule? “…porque sua única tarefa é gerenciar mensagem. Todos os fornecedores comerciais queriam nos vender um pacote completo de produtos. Mas o ponto principal de SOA é passar de um sistema fechado para outro’…“, afirma o diretor de infraestrutura de sistemas


3. United Airlines
Grande empresa aérea dos EUA, companhias aéreas, assim como empresas de Telecom, de Finanças etc, tem muitas tarefas baseadas em eventos. É neste ponto que entra a EDA (Event-driven Architecture).
Histórico: a United investiu há tempos em EDA, usando o WebSphere da IBM como barramento de mensagem por sete anos. Em 2006, deu início a uma implementação SOA para lidar com os web services modernos usados no web site United.com.
Precisa conviver com estes 2 ambientes (EDA e SOA)
Desafio: projetar e implementar serviços em uma empresa que tem duas arquiteturas e necessita de ambas
Problemas que tiveram com ESB: “ESBs não utilizam padrões fora dos padrões de web services”, afirma o gerente de middleware da United
Por que o ESB é tão importante? a United “...valoriza o uso de ESBs para SOA e EDA porque eles lidam com mensagem, transformações de dados e outras tarefas críticas de roteamento de dados….“
Experiência com EDA+SOA: falta de esquemas XML padrões para EDA, fazendo com que a transferência de mensagens entre serviços EDA e SOA seja mais complexa e demande mais pessoal.


4. Thomson Financial
Empresa de serviços de informações financeira (também uma das maiores do mundo).
Lições aprendidas: “…Um grande número de empresas aprecia o conceito de SOA porque ele promete acelerar o desenvolvimento. Mas alguns desenvolvedores descobriram que um elemento-chave da governança de serviço, na realidade, pode retardar o desenvolvimento, roubando a velocidade prometida. “
Serviços: muitos (milhares) com om alta granularidade, baixa granularidade — com tudo que pode haver entre os dois — e uma equipe de arquitetura pequena
Solução: recorrer à automação utilizando ferramentas de avaliação de políticas da WebLayers. “As ferramentas são mais eficientes e não deixam passar violações”, diz o VP de serviços de gerenciamento de produto


5. Jabil
A Jabil é uma grande empresa de manufatura (monta circuitos, impressoras, computadores etc).
Desafio: integração do cliente – por exemplo, sistemas de billing, previsão e entrada de pedidos e os muitos sistemas utilizados por seus clientes; é muito difícil gerenciar toda esta comunicação ponto-a-ponto à medida que a base de clientes cresce e evolui os próprios sistemas
Arquitetura anterior: baseada em “hubs” de integração para trocar informações com seus mais de 5.000 parceiros. Resultado: muita dificuldade para manter manualmente todas as interfaces
Solução: adotou princípios SOA para substituir a maioria destas conexões personalizadas por conexões baseadas em serviços que possibilitam a reutilização de funções comuns
Produto/Abordagem de implantação: Ao invés de usar um ESB para gerenciar mensagens, um registro para gerenciar o repositório de serviços ou um ambiente de desenvolvimento orientado a SOA para desenvolver os serviços, a Jabil emprega o Gentran Integration Suite da Sterling Commerce para as três finalidades. O pacote é projetado para interações do supply-chain.

domingo, 12 de outubro de 2008

Passo a passo com EJB 3.0 – Enterprise JavaBeans

Objetivos do Tutorial:

Ajudar no desenvolvimento das primeiras aplicações, utilizando EJB 3.0.
Indicar uma sequência de passos a serem seguidos a fim de compreender os
principais mecanismos oferecidos por esse framework.

Passo 1: Configurar o Ambiente

Jboss AS 4.0.4 instalado com perfil EJB 3.0 (http://labs.jboss.com/jemsinstaller/, baixar o arquivo: 1.2.0.GA)
Eclipse SDK, versão 3.2 http://www.eclipse.org/downloads/
PostgreSQL, versão 8.2 http://www.postgresql.org/download/
Driver do PostgresSQL http://jdbc.postgresql.org/download.html, baixar arquivo
JDBC3)

Passo 2: Contruir Projeto

Crie um Java Project. Modifique o Build Path do projeto para referenciar as APIS do JBOSS que estão no diretório jboss-4.0.5.GA \ client.

Passo 3: Construir Entidade

import javax.persistence.Entity;
import javax.persistence.Id;

@ Entity
public class Curso implements Serializable {

@ Id
@ GeneratedValue
private Integer cod;
private String nome;
/ /.. getters e setters omitidos
}

Essa entidade utiliza anotações presentes na bibliteca do JPA, Java Persistence API. A anotação @ Entity define a classe como persistente.

Os cursos serão persistidos na tabela? curso? na base de dados, pois por default o JPA considera o nome da classe igual ao da tabela. a anotação @ Id define o atributo cod como o identificador da tabela no banco de dados a anotação @ GeneratedValue define que o valor do atributo cod será gerado automaticamente no momento em que os objetos forem persistidos.


Passo 4: Construir Interface

import javax.ejb.Local;
import javax.ejb.Remote;

@ Remote
public interface Cadastrar {

void cadCurso (Curso curso);
Collection getCursos ();
}

Características de EJB 3

Antes de criar o Session Bean, é preciso definir suas interfaces de acesso. Um Stateless Session Bean, definido no próximo passo, pode ter uma interface local e remota.

Nesse exemplo, a interface é remota. A anotação @ Remote define essa interface como Remota, oferecendo acesso a clientes remotos. Para declarar uma interface como Local? que não oferece acesso a clientes remotos, deve ser utilizada a anotação @ Local. Esse tipo de interface deve ser usado para clientes localizados na mesma JVM onde está rodando o container de EJBs.


Passo 5: Construir Session Bean



import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@ Stateless
public class CadastrarBean implements Cadastrar {

private List cursos;

@ Persistence
Context EntityManager entitymanager;

public CadastrarBean () {

cursos = new ArrayList ();

}

public void cadCurso (Curso curso) {

entitymanager.persist (curso);

}

public List getCursos () {

cursos = entitymanager.createQuery (" select * from CURSO "). getResultList (); return cursos;

}

}


Características de EJB 3
O Session Bean representa um cliente no servidor J2EE. Para acessar a aplicação, o cliente invoca os métodos do Session Bean. É similar a uma sessão interativa, sendo único para cada cliente. Assim como a sessão, os dados do bean não são armazenados em uma base de dados. Quando o cliente encerra a sessão, o session finaliza e não ficará mais associado a ele.


Existem dois tipo de Session Bean: Stateless e StateFul. A anotação @ Stateless define a classe CadastrarBean como sendo do tipo Stateless. É mais leve e indicado para processos que não necessitam manter estado (valores de atributos) durante as chamadas de métodos. Para definir o tipo Stateful, é necessário atribuir a anotação @ Stateful. Esse bean é mais pesado, mas garante a preservação do estado entre as chamadas de métodos de um mesmo cliente.

A anotação @ PersistenceContext, da API de JPA, possibilita o processo de injeção de dependência. O container EJB reconhece a anotação e, automaticamente, injeta um objeto EntityManager na propriedade.

Passo 6: Contruir os arquivos de configuração

Vejamos o arquivo persistence.xml

xmlns: xsi = " http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = " http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

java: / CursoDS

Esse arquivo deve ser inserido na aplicação, no diretório META-INF / persistence.xml. O elemento deve estar associado ao elemento do arquivo curso-dx.xml, explicado abaixo.

Vejamos o arquivo curso-ds.xml

CursoDS jdbc: postgresql: / / localhost: 5432 / curso org.postgresql.Driver
postgres
postgres
PostgreSQL 7.2

Esse arquivo deve ser inserido dentro do diretório server \ default \ deploy do JBOSS.

Nesse arquivo, são configuradas as propriedades referentes à conexão com o banco de dados PostgreSQL. O nome CursoDS configurado através do elemento está associado ao elemento, mencionado no arquivo de configuração citado anteriormente.

Passo 7: Deploy do projeto

Após ter criado o projeto, exporte para arquivo. jar dentro do diretório jboss-4.0.5.GA / server \ default \ deploy do JBOSS. Repare que é o mesmo local onde fica armazenado o curso-ds.xml.

Inicie a conexão com o PostgreSQL e crie um banco de dados com o nome curso.
Coloque o driver do PostreSQL no diretório jboss-4.0.5.GA2 \ server \ default \ lib do JBOSS. Inicie o JBOSS e confira se o projeto foi deployado. Confira se a tabela curso foi criada no seu banco.

Passo 8: Construir o Cliente

Crie no mesmo projeto a classe abaixo:

import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;

public class Cliente {

public static void main (String [] args) throws Exception {

Hashtable prop = new Hashtable ();
prop.put (InitialContext.INITIAL_CONTEXT_FACTORY, " org.jnp.interfaces.NamingContextFactory ");
prop.put (InitialContext.PROVIDER_URL, " jnp: / / localhost: 1099 ");

Context ctx = new InitialContext (prop); Cadastrar cad = (Cadastrar) ctx.lookup (" CadastrarBean / remote ");

Curso curso = new Curso ();
curso.setNome (" AJAX ");
cad.cadCurso (curso);
curso.setNome (" XML ");
cad.cadCurso (curso);
curso.setNome (" PROGRAMAÇÃO ");
cad.cadCurso (curso);

for (Curso c: cad.getCursos ()) {
System.out.println (c.getCod () +? -? + c.getNome ());
}
}
}

Características de EJB 3

É necessário realizar a conexão com o serviço de nomes, através de um objeto InitialContext da API JNDI (Java Naming and Directory Interface). Através desse objeto, é possível obter um referência para o objeto remoto.

Nesse exemplo, o contexto deve ser inicializado por meio de um objeto HashTable. Caso a aplicação fosse construída utilizando um mesmo container, o contexto seria único e conhecido.

Então, não seria necessário especificá-lo, possibilitando a inicialização do objeto InitialContext sem parâmetros. Através do método ctx.lookup (" nome-da-clase / remote "), um Session Bean remoto é solicitado ao container.

Passo 9: inicializar o Cliente