Tutoriais do GUJ sobre JTable

Sim, eu já li os tutoriais sobre JTable no GUJ.
O problema é que eu não encontrei nada sobre configurar o JTable baseado num banco de dados/tabelas já existente, tipo hsqldb, oracle, mysql, etc…

O que ocorre é que o JTable não é “database-aware” (ou seja, não dá para associar diretamente um ResultSet a um JTable e pedir que ele mostre os resultados de uma consulta.)
Ele é só uma forma de visualizar dados em linhas e colunas.
Dei uma olhada no Google e veja só o que apareceu:

QuickTable is a complete java JTable alternative Javabean/Grid control. It has all the features which are missing in JTable and it is built on top of JTable, so you don’t have to learn any new API. QuickTable is bundled with lots of features including Print Preview, Printing, Find & Replace, Sorting, Skin, copy/paste to Excel, Image cells, Calendar cell editor,Customizer etc. QuickTable can be used as

* Database Grid
* EJBs/DataObjects/Hibernate Grid
* Delimited/Fixed length data file Grid
* Array/Vector/Collection Grid

DISCLAIMER - não sei se esse QuickTable é bom; só sei que ele já tem todas essas capacidades de conexão a bases de dados etc.

É exatamente isso que eu quero. Exibir numa JTable os dados contidos numa tabela criada por um hsqldb, mysql, etc…

Olá

Pra isto já existem varias soluções grátis e prontas como o DBVisualizer por exemplo.

Mas será que estou entendendo direito? Alguém em 2006 quer escrever código em que a camada de apresentação acessa diretamente a base de dados como se Java fosse Clipper ou VB?

Se é para trabalho de escola esta faculdade está pelo menos uns 10 anos obsoleta. Se for coisa profissional é o chamado tiro no pé.

Vou repetir o que já disse várias vezes aqui no GUJ: escrever código para rodar em máquinas confinadas por rede local como faz o obsoleto Office é jogar dinheiro fora.

Para mim, desde o início de 2001 quando comecei a usar servlets e o Tomcat, não há nenhum sentido em escrever código que não esteja pronto para rodar na internet, MESMO que seja para funcionar em uma única máquina.

O trabalho de colocar o acesso à base de dados por trás de um servlet container usando JDBC, Hibernate ou iBatis, é bem parecido ao acessar à base direto pelo Swing. A diferença é que via servlets o programa pode rodar em qualquer parte do mundo.

Código lá do site do quicktable:

DBTable dBTable1 = new DBTable();
  dBTable1.connectDatabase(
        "oracle.jdbc.driver.OracleDriver",
        "jdbc:oracle:thin:@myServer:1526:myInstance",
        "username" ,
        "password");
  dBTable1.setSelectSql("select * from employee");
  dBTable1.refresh();

Thingol, desculpe a franqueza, mas o trecho de código acima é a coisa mais idiota e antiquada que li nos últimos anos. Pior que isto só se fizesse em Clipper.

[]s
Luca não acreditando nesta tentativa de volta ao milênio passado.

É claro que isso (esse tal do QuickTable e outras coisas parecidas) é coisa do tempo do VB 3.0.
Mas se o cara insiste…
O que vem de gente tentando conectar-se ao banco de dados via applet também não está escrito. Cada dois dias aparece um fulano desses, tenho de criar um tópico trancado só para explicar pela enésima vez: não faça isso!

Olá

Thingol, a turma antiga aqui do GUJ já pegou muito no meu pé com a minha insistência de que não tem sentido nenhum programa que não acesse a Internet. Eu costumo dizer que programa desktop que conheço é o Firefox, Internet Explorer, Visual Spectator (regata volta ao mundo on line), etc. São programas que ficam aqui no meu desktop e que acessam a Internet.

O exemplo que costumo usar é o seguinte:

:arrow: Sistema de contas a pagar da pastelaria da esquina do Sr Chung Lee.
Caso de uso mais do que comum: Sr Chung Lee de férias na China acessa o sistema para saber quais contas precisa pagar via banco on line.

Se o sistema não estiver com arquitetura baseada na Internet o pobre chinesinho Sr Chung Lee virará pastel e mal pago.

[]s
Luca

[quote=Luca]Olá

Thingol, a turma antiga aqui do GUJ já pegou muito no meu pé com a minha insistência de que não tem sentido nenhum programa que não acesse a Internet. Eu costumo dizer que programa desktop que conheço é o Firefox, Internet Explorer, Visual Spectator (regata volta ao mundo on line), etc. São programas que ficam aqui no meu desktop e que acessam a Internet.

O exemplo que costumo usar é o seguinte:

:arrow: Sistema de contas a pagar da pastelaria da esquina do Sr Chung Lee.
Caso de uso mais do que comum: Sr Chung Lee de férias na China acessa o sistema para saber quais contas precisa pagar via banco on line.

Se o sistema não estiver com arquitetura baseada na Internet o pobre chinesinho Sr Chung Lee virará pastel e mal pago.

[]s
Luca[/quote]

Acho que existe espaço ainda para aplicações C/S clássicas. Imagine, por exemplo, o caso em que um engenheiro está “perdido” no meio de uma jazida de ferro no meio do nada no Pará, com seu laptop de última geração mas em um lugar sem acesso à internet. Como ele, por exemplo, vai conseguir fazer com que seu sistema de gerenciamento de balanças de pesagem funcione se ele está isolado do mundo? Em casos como este (existem muitos outros, mas este é um caso pela qual eu particularmente tenho convivido ultimamente), é preciso ter uma aplicação “anos 80”, usando Swing e (talvez) um banco de dados embutido (à la Derby ou HSQLDB), permitindo que o engenheiro possa trabalhar desconectado da internet até o momento em que ele voltar ao seu confortável hotel para se conectar à internet e sincronizar suas informações com o sistema central :wink: Portanto, lembre-se: there is no silver bullet, principalmente quando se fala de arquitetura.

Agora, tentando ajudar ao nosso colega com problemas com o Swing. Eu, infelizmente, não posso postar um código aqui para ajudá-lo. Mas o caminho das pedras posso passar: procure implementar um novo TableModel para seu JTable (como o thingol falou, JTable não é DB-aware), onde, neste TableModel, você faça o acesso a base de dados e, a partir do ResultSetMetaData, você obtenha a quantidade e os nomes da colunas que retornarem de uma certa consulta. Como referência (bobinha, mas funcional): http://www.rgagnon.com/javadetails/java-0309.html

Olá

Daniel, sem querer polemizar mas já polemizando…

Eu já trabalhei em uma aplicação Swing exatamente do tipo que você citou, com o agravante que era para máquinas lentas e nem assim concordei que fosse escrita como aplicação local isolada.

É sempre possível ter um tomcatzinho ou um jettyzinho rodando (ou embutido na aplicação) para acessar um servletzinho que por sua vez acessa um banquinho de dados bem localzinho usando um hibernatezinho da vida.

A qualquer momento alguém pode fazer tcham e separar o tomcat e a base de dados do notebook do cara e rodar tudo pela Internet. Todas as últimas aplicações que trabalhei rodavam TAMBÉM localmente nos notebooks de quem fazia as demos nos clientes. No máximo era necessário um emulador de resposta de um banco ou uma telco e alguns emuladores de resposta de periféricos tipo balança, PINpad, etc.

Você me conhece há tempos e sabe que a menos que seja para um trabalhinho de escola de aluno do tipo que só faz o mínimo que o professor pede, eu não admito gastar massa cinzenta para fazer código com acesso a base de dados que só rode localmente. Nem se for para uma agenda pessoal.

[]s
Luca

Hehehe. Eu sei, Luca. Mas e se o cara estiver isolado no meio do nada e precisar obter e guardar novas informações neste lugar sem internet? Neste caso, o cara vai precisar de uma aplicação que rode localmente. Agora, se você prefere fazer isso usando uma arquiteura C/S clássica usando um banco embutido ou se você prefere fazer isso com uma arquitetura “localhost”-RIA, acho que isso vai depender muito mais dos requisitos do sistema em si do que “o que é a moda desta estação”.

RIA’s são ótimas, particularmente as acho “a solução definitiva” para os problemas de distribuição X usabilidade X manutenção, mas ainda assim há “custos” envolvidos: criar uma RIA pode ser mais caro do que criar um C/S com funcionalidades análogas, pois envolve um conjunto mais amplo e mais complexo de tecnologias, além de requerer uma arquitetura melhor desenvolvida para que a distribuição de responsabilidades entre as camadas e a tolerância a falhas seja adequada. Estes “custos” podem ser muito altos demais para uma aplicação muitas vezes simples (talvez meros CRUDs, como a agendinha pessoal de contatos), o que faz a opção por uma RIA inviável. Como eu falei, tudo depende do caso (there is no silver bullet).

Aproveitando o topico , para atualizar um JTable apos um INSERT , DELETE e UPDATE , há Listeners para isso ?
Tipo tenho um metodo na minha classe controle que apos de um INSERT ele busca no banco o novo registro e retorna o novo modelo para o JFrame o probelma que JTable nao atualiza com o novo registro , a impressao que nao adiciona no JPanel …
Fiz assim:

//Minha classe extend JPanel
public void mostrarListaTamanho(MyTableModel objMt)
	{
		mt = objMt;
		JTable tableTamanho = new JTable(mt);
		tableTamanho.clearSelection();
		tableTamanho.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		ListSelectionModel linhas = tableTamanho.getSelectionModel();
		linhas.addListSelectionListener(this);
	    JScrollPane spTamanho = new JScrollPane(tableTamanho);
		spTamanho.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		spTamanho.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		spTamanho.setBounds(new Rectangle(10,90,350,100));
		panelTam.add(spTamanho);
		super.add(panelTam);
	}

Na minha classe controle :

public void mostrarListaTamanho()
	{
		cIntSbdTam = new CIntSbdTamanho();
		cIntTam.mostrarListaTamanho(cIntSbdTam.mostrarListaTamanho());// passo a nova referencia 
MyTableModel para Interface 
	}
	
	public void inserirTamanho(CTamanho objTamanho)
	{
		CTamanho cTam = objTamanho;
		cIntSbdTam = new CIntSbdTamanho();
		if (cIntSbdTam.inserirTamanho(cTam) > 0) 
			cIntTam.mostarMsgSucesso();
		else
			cIntTam.mostrarMsgErro();
		
	mostrarListaTamanho();	// aqui chamo mostrarListaTamanho para redesenhar o JTable apos um insert 
	//	cIntTam.mostrarListaTamanho();
	}

Tem estas dicas aqui:

http://www.guj.com.br/posts/list/13322.java

http://www.imasters.com.br/artigo/2103

http://www.devmedia.com.br/articles/visualizacomponente2.asp?comp=2087

bom, se vc aprender como se insere uma nova linha em um Jtable, o resto é simples. Basta fazer uma consulta JDBC, ler os resultados, e adicionar as linhas na tabela normalmente… é tudo que posso dizer :slight_smile:

Esse para mim é o grande problema do Java. De modo geral todo profissional Java que usar um arquitetura super sofisticada quando o problema é super simples, como uma agenda pessoal.

O argumento é sempre o mesmo, mas se um dia o usuário quiser… Bola de cristal.

O que tem que ser levado em conta sempre é o valor que isso vai gerar para o produto, se eu quero comprar um carro sem farol de milha, por favor, não me entregue o carro COM farol de milha. Eu não quero pagar por isso.

Um exemplo: sistemas de BI. Você já pensou em fazer um sistema de BI sem acessar o banco diretamente? Coisa de loco. É impossível mapear os dados para objetos, até por que muitas das vezes você nem sabe quais são os dados e usa metadatos.

E não vem me dizer que você pode mapear assim mesmo, ou então usar JMI… Já trabalhei muito com JMI e mapeamentos genéricos e no final só fazem o sistema ficar mais complexo e caro. Muitas das vezes, o usuário (um tipo de usuário avançadinho) vai mesmo é inserir queries (seja sql, dmx, ou qq que seja a linguagem de query) na mão mesmo.

Eu pessoalmente não vejo nenhum problema em acessar o banco diretamente. Embora concorde que muitas das vezes, é melhor se ter uma camada de acesso a mesmo. Mas “muita das vezes”, e não todas.

Bem, é só minha opnião, minha experiência. Sem pedras por favor.

Acho que mesmo com a necessidade de ter dados quando se esta off-line não inválida a estratégia do tomcatzinho do Luca.

Você teria o mesmo trabalho que tem pra projetar uma app C/S stand-alone que sincroniza dados com o servidor, porém com todas as vantagens que desenvolver pra WEB traz.

Olá

Penso exatamente ao contrário: esta é a grande vantagem do Java. Se pode programar com extrema facilidade uma aplicação completamente pronta para rodar de qualquer jeito em qualquer lugar.

A única diferença é que ao invés de pegar o ResultSet direto na base e popular o JTable, a gente o intermedeia com URLConnection. Só precisa de um servletzinho de poucas linhas para incluir o código de acesso à base. O custo em termos de horas de programação, separação de responsabilidades e facilidade de depuração é o mesmo.

Não tenho experiência com desenvolvimento de sistemas de BI mas tudo que já vi de Datawarehouse, OLAP, Data mining, CRM, etc não eram sistemas que rodassem em modo LOCAL com tudo na mesma máquina ou apenas em rede local.

Por fim, se agenda local fosse coisa boa, o Lotus Notes nunca teria sido desenvolvido e pouca gente já teria ouvido falar do Ray Ozzie que em 15 de junho chegou a Chief Software Architect da Microsoft.

[]s
Luca

[quote=Luca]

Por fim, se agenda local fosse coisa boa, o Lotus Notes nunca teria sido desenvolvido e pouca gente já teria ouvido falar do Ray Ozzie que em 15 de junho chegou a Chief Software Architect da Microsoft.

[]s
Luca[/quote]

Resumidamente, você quer dizer que C/S, hoje em dia, não faz sentido para absolutamente MAIS NADA? Inclusive em um caso onde o sistema precise ser executado de modo desconectado, localmente?

[EDITADO: Conteúdo agressivo removido. Talvez eu seja insensato então. DQO]

[UPDATE: Sugestão para o usuário “coffee break mao”: se você quiser tirar satisfações com o Luca, tire-as por Private Message, por favor. Não quero mais ficar moderando suas mensagens. DQO]

QUEM TIVER BOM SENSO, VAI ENTENDER A MENSAGEM…

Fugindo do barraco:

http://www.guj.com.br/posts/list/0/36359.java

Olá

Sobre arquitetura C/S sei que ainda existe empresas que ganham dinheiro com este modelo apesar de geralmente exigir uma licença de base de dados para cada conexão. Mas são sistemas antigos e não acredito que adotariam este modelo se o desenvolvimento tivesse começado depois de 2001.

Quanto a sistemas isolados, fora um ou outro softwarezinho para mostrar imagens, ou meus antigos sistemas em Fortran de cálculo de estruturas (*), não me lembro de muitos casos de sistemas que rodem SEMRE desconectados.

Como já falei antes, muitos softwares podem em determinados momentos funcionar desconectados. É só você acompanhar os vendedores que vão pelas ruas com seus Palms ou POS, coletando dados para em algum outro momento sincronizar os dados com uma base central.

Mas você acha que isto justifica misturar acesso à base de dados com a camada de apresentação?

(*) Infelizmente meu atual trabalho é dar manutenção em um deles e inclusive descobri um eclipse para fortran (http://www.photran.org)

[]s
Luca

[quote]Mas será que estou entendendo direito? Alguém em 2006 quer escrever código em que a camada de apresentação acessa diretamente a base de dados como se Java fosse Clipper ou VB?

Se é para trabalho de escola esta faculdade está pelo menos uns 10 anos obsoleta. Se for coisa profissional é o chamado tiro no pé.

Vou repetir o que já disse várias vezes aqui no GUJ: escrever código para rodar em máquinas confinadas por rede local como faz o obsoleto Office é jogar dinheiro fora.

Para mim, desde o início de 2001 quando comecei a usar servlets e o Tomcat, não há nenhum sentido em escrever código que não esteja pronto para rodar na internet, MESMO que seja para funcionar em uma única máquina.

O trabalho de colocar o acesso à base de dados por trás de um servlet container usando JDBC, Hibernate ou iBatis, é bem parecido ao acessar à base direto pelo Swing. A diferença é que via servlets o programa pode rodar em qualquer parte do mundo.

Código lá do site do quicktable:
Code:
DBTable dBTable1 = new DBTable();
dBTable1.connectDatabase(
“oracle.jdbc.driver.OracleDriver”,
“jdbc:oracle:thin:@myServer:1526:myInstance”,
“username” ,
“password”);
dBTable1.setSelectSql(“select * from employee”);
dBTable1.refresh();

Thingol, desculpe a franqueza, mas o trecho de código acima é a coisa mais idiota e antiquada que li nos últimos anos. Pior que isto só se fizesse em Clipper.

[]s
Luca não acreditando nesta tentativa de volta ao milênio passado.
[/quote]

E ISSO QUE O TAL DE luca escreveu? ISSO NÃO É OFENSIVO? PORQUE MINHA MENSAGEM É EDITADA E A DELE NÃO?

[quote=coffee break mao][quote]Mas será que estou entendendo direito? Alguém em 2006 quer escrever código em que a camada de apresentação acessa diretamente a base de dados como se Java fosse Clipper ou VB?

Se é para trabalho de escola esta faculdade está pelo menos uns 10 anos obsoleta. Se for coisa profissional é o chamado tiro no pé.

Vou repetir o que já disse várias vezes aqui no GUJ: escrever código para rodar em máquinas confinadas por rede local como faz o obsoleto Office é jogar dinheiro fora.

Para mim, desde o início de 2001 quando comecei a usar servlets e o Tomcat, não há nenhum sentido em escrever código que não esteja pronto para rodar na internet, MESMO que seja para funcionar em uma única máquina.

O trabalho de colocar o acesso à base de dados por trás de um servlet container usando JDBC, Hibernate ou iBatis, é bem parecido ao acessar à base direto pelo Swing. A diferença é que via servlets o programa pode rodar em qualquer parte do mundo.

Código lá do site do quicktable:
Code:
DBTable dBTable1 = new DBTable();
dBTable1.connectDatabase(
“oracle.jdbc.driver.OracleDriver”,
“jdbc:oracle:thin:@myServer:1526:myInstance”,
“username” ,
“password”);
dBTable1.setSelectSql(“select * from employee”);
dBTable1.refresh();

Thingol, desculpe a franqueza, mas o trecho de código acima é a coisa mais idiota e antiquada que li nos últimos anos. Pior que isto só se fizesse em Clipper.

[]s
Luca não acreditando nesta tentativa de volta ao milênio passado.
[/quote]

E ISSO QUE O TAL DE luca escreveu? ISSO NÃO É OFENSIVO? PORQUE MINHA MENSAGEM É EDITADA E A DELE NÃO?[/quote]

Pode não ter sido pertinente ao tópico, mas não foi agressivo, principalmente pelo fato de ele não tre debochado de você nem usado palavras agressivas ou de baixo calão. Se você se sentiu ofendido, você tem todo o direito de cobrar dele uma explicação (em particular), desde que sejam mantidas boas condutas. Como eu falei, fórum não é lugar para lavar roupa suja. Se quiser tirar satisfações com alguém, use as mensagens privadas.

Obrigado.