Criar tela Master/Detail em Java

Pessoal,
Boa tarde!!

Sou novo aqui no forum, e esse é meu primeiro post. Estou iniciando também em Java e já me deparei com uma dúvida: preciso desenvolver uma tela estilo Master/Detail. Nem sei por onde começar. Uso o NetBeans 6 para desenvolver a interface, juntamente com o MySQL 5 como base de dados. Já tenho as tabelas apropriadas todas definidas. O NetBeans já possui componentes que podem me auxiliar quanto a isso??

Detalhes:

  1. A relação Master/Detail não precisar ser, necessariamente, em forma de Grid para a parte superior da tela. Na parte de cima (Master) eu pensei em deixar campos navegáveis, os mesmos que serão utilizados para inserir os registros.

  2. Na parte de baixo da tela, essa sim em forma de Grid, eu gostaria que os registros forem inseridos dinamicamente, ou seja, a medida que o usuario fosse dando ENTER no final de cada linha, novos registros fossem sendo inseridos abaixo. Caso não dê assim, pensei em abrir uma tela auxiliar para tal.

Podem me ajudar??

Agradeço desde já!!

Genivaldo

Companheiro,

algo parecido com o Dataset (master/detail) não existe, por uma série de motivos.

Mas você pode fazer algo similar usando beans binding.

Veja uns exemplos:

http://www.netbeans.org/kb/60/java/swing-app-beans-binding-screencast.html
http://weblogs.java.net/blog/zixle/archive/2006/05/ease_of_swing_d.html
http://www.oreillynet.com/onjava/blog/2006/11/thoughts_on_data_binding_and_s.html

Um exemplo da Oracle:
http://www.oracle.com/technology/products/jdev/howtos/10g/interceptor.html?_template=/ocom/print

E no koders, tem exemplo de uns datatables… mas foge as boas práticas do java…
http://www.koders.com/java/fidA12C1ABBFA663EF7E34002BEEF06B65E5CC76F19.aspx

Aqui tem um exemplo legal (esse eu já usei como base para um programa…) Monta um jtable com paginação.
http://www.java2s.com/Code/Java/Swing-JFC/AquickapplicationthatdemonstratesthePagingModel.htm
http://www.java2s.com/Code/JavaAPI/javax.swing.table/extendsAbstractTableModelPageableModelforlargedatasetinJTable.htm
http://www.javafaq.nu/java-example-code-878.html

Outro exemplo que vale a pena:
http://www.javaworld.com/javaworld/javatips/jw-javatip137.html?page=1

Aqui tem um exemplo da sun, veja remote table:
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html#remote-table

espero que te ajude.

fw

Olá, Dieval.

Primeiramente, quero agradecer por suas sugestões. Uma outra pergunta. Como você disse: “algo parecido com o DataSet [alá Delphi] não existe, por uma série de motivos”, sendo assim, existe alguma outra sugestão para que eu monte uma tela desse tipo?! Qdo falo “desse tipo” é porque vejo constantemente algo assim, logo, foi a primeira coisa que me veio a mente. Mas devido a essas particularidades da linguagem, somos obrigados a mudar um pouco o desenho da tela. Num dos exemplos você disse que usou como base. Poderia me dar maiores detalhes? Se não dá pra fazer EXATAMENTE como Master/Detail, eu gostaria de pelo menos uma idéia pra desenvolver algo semelhante.

Agradeço,
Genivaldo

Olá Genivaldo,

primeiramente, preciso te dizer que a minha experiência com swing é pequena, eu fiz apenas 3 sistemas (conversões de access para java, e de delphi para java).

Basicamente, as situações que mantive o master/details foram em situações que a regra de negócio assegurava que não haveria acesso concorrente a mesma informação ou que a probabilidade de ocorrer seria quase nula. Foram elas:

  1. cadastro de dependentes e dados de planos de saúde para uma associação;
  2. cadastros simples de um controle acadêmico
  3. Sistema de grade horária (esse em andamento).

Estou tendo bastante trabalho na conversão da aplicação delphi para java, principalmente em telas que apresentam quase todos os registros em tabelas e o filtro fosse sendo aplicado de forma incremental (por exemplo, nomes que tenha a palavra josé (com ou sem acento)).

No delphi, utilizando os dataset padrões (ttable ou tquery), qualquer edição de registro implica no lock do registro (master) e dos filhos (detail). Se a aplicação trava ou é fechada, fica a responsabilidade para o BDE ou para o SGBD eliminar os locks. No java, isso tem que ser feito praticamente na mão, ou deixar que o SGBD faça (alto custo).

Para você ter uma idéia da complexidade, em um projeto com alta concorrência, tivemos que manter duas instâncias do registro alvo, e antes de aplicar as alterações, consultar o mesmo registro usando uma transação serializada para poder efetivar as alterações… caso o mesmo campo tivesse sido modificado, o registro voltava para o usuário fazer a reconfirmação.

Com relação a sugestão de telas, eu faço duas recomendações:

  1. Se é um caso similar aos citados acima, sem problemas - eu normalmente uso o jtable mesmo
  2. Se a idéia é apresentar uma tabela com alguns dados inicial para que o usuário possa iniciar as operações, tende criar uma restrição temporal, como no caso de uma agenda - retornar apenas os dados do dia, da semana ou eventualmente do mês. Nestes casos, evitar a edição direta na tabela, uma vez que a permanência da informação na tela pode ser muito longa e ela pode sofrer alterações concorrentes. Logo, se você escolheu um registro de um jtable que será editado em uma segunda tela (ou panel), faça uma nova pesquisa desse dado. Isso aumentará o uso do banco, mas o resultado será mais confiável.
  3. A maior parte dos bancos, permitem limitar o número de linhas das querys (algo como o top do oracle, ou limit do mysql/postgres), isso facilita bastante a criação de sistemas de paginação. Te garanto que ninguém lê as informações de uma tabela com mais de 50 ou 100 linhas…

Outra coisa, vamos supor que você faça a carga de 300.000 registros de clientes (300.000 objetos pojos desses clientes), quando você apresentar alguns dados destes no jtable, por exemplo números e datas, estes serão “convertidos” para String, então o seu heap vai aumentar um monte, começará a exigir mais memória para a sua aplicação e mais do gc.

Eu ainda não consegui chegar a nenhuma fórmula mágica sobre essa questão, na minha aplicação atual, tenho um “grid” que apresenta aproximadamente 1.000 registros. Mas ela pode crescer exponencialmente (grade horária) (período x turma x aula ).

espero que te ajude.

fw