Esse artigo faz parte da revista Java Magazine edição 22. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML. 

Mais Leveza Extrema

Recursos avançados de Thinlet

Conheça mais recursos da API Thinlet, e dê uma aparência mais profissional a suas aplicações locais

Daniel Destro do Carmo

No artigo “Leveza Extrema no Desktop”, na Edição 21, foram apresentados conceitos básicos e algumas funcionalidades importantes da API/Toolkit Thinlet. Porém a Thinlet tem muito mais a oferecer. Nesta edição vamos analisar facilidades mais avançadas, como componentes de árvore, abas, tabelas, menus, imagens e caixas de diálogo, além de demonstrar a separação de telas em vários arquivos XML, o acesso a dados e recursos de internacionalização.

Caso de estudo

A aplicação de exemplo, uma extensão da que criamos na edição anterior, é um pequeno programa de agenda, com cadastro e listagem dos contatos cadastrados. Os dados são armazenados num banco relacional em uma tabela chamada "Contato".

No exemplo disponível para download usamos o MySQL, mas o código mostrado aqui funciona com qualquer SGBD que tenha um driver JDBC (será necessário apenas mudar a implementação da classe DAO).  O comando SQL para a criação da tabela é mostrado na Listagem 1. Como de praxe, para executar o exemplo, você vai precisar colocar o driver JDBC no classpath da aplicação.

A interface gráfica é composta de quatro telas: Principal, Cadastro, Relatório e Sobre. Para modularizar o código, criamos um arquivo XML e uma classe de controle para cada tela. Há ainda uma caixa de diálogo para exibir informações de controle da aplicação, como mensagens de erro ou avisos. Veja a aplicação rodando na Figura 1.

Listagem 1. DDL da tabela Contato

CREATE TABLE CONTATO (

  ID INTEGER NOT NULL,

  NOME VARCHAR(50) NOT NULL,

  EMAIL VARCHAR(50),

  CATEGORIA VARCHAR(20)

)

 

Figura 1. Tela do programa, Agenda de Contatos.

Tela principal

A Listagem 2 apresenta a definição da tela principal, que é composta por um painel (<panel>) contendo uma barra de menus (<menubar>) e um painel com abas (<tabbedpane>). Cada menu (Arquivo e Ajuda) é definido com um elemento <menu>; seus itens são inseridos com <menuitem>. O elemento <separator> adiciona uma linha separadora (ele pode também ser usado em painéis). O atributo action dos itens especifica o método da classe controladora a ser executado quando esses itens forem selecionados.

O <tabbedpane> da tela principal contém duas abas (criadas com elementos <tab>). Na propriedade action é definido o método a ser invocado quando a aba for selecionada. As definições dos elementos de cada aba foram separadas em dois arquivos XML externos. Poderíamos também ter aninhado essas definições dentro dos próprios elementos <tab>, mas a abordagem usada é mais modular.

A classe contatos.AgendaContatos (mostrada na Listagem 3) é uma subclasse de thinlet.Thinlet e é responsável pelo controle da tela principal e da aplicação como um todo. Ela implementa o método main(), além dos métodos declarados nos action da tela principal. É no construtor dessa classe que são carregadas as configurações dos arquivos XML; começamos carregando a tela principal e a adicionando ao controlador da aplicação:

 

Object telaPrincipal =  super.parse("../agenda_contatos.xml");

super.add(telaPrincipal);

 

Em seguida, instanciamos a classe de controle da tela de cadastro, contatos.CadastroContato, carregamos suas configurações e adicionamos a tela à sua respectiva aba:

 

cadastroContato = new CadastroContato(this);

Object telaCadastro = super.parse(

       "../cadastro_contatos.xml", cadastroContato);

Object tabCadastro = super.find("tabCadastro");

super.add(tabCadastro, telaCadastro);

 

Note que os dois argumentos do método parse() são o nome do XML de definição da tela e o objeto controlador.

O próximo passo é carregar os dados iniciais dos contatos, usando o método auxiliar carregarDadosArvore() de CadastroContato. Por fim, o mesmo processo – desde a carga do XML até o tratamento de eventos – é feito para a tela de relatório (relatorio_contatos.xml).

Quando alguma das abas for selecionada, o método tabSelecionada() será executado. Nele verificamos o nome da aba e invocamos o método do controlador correspondente, para carregar os dados e exibi-los na aba. Queremos também que seja possível trocar de aba via os itens Arquivo|Cadastro e Arquivo|Relatório. Sempre que algum destes é escolhido, chamamos o método trocarTab(), que recebe o objeto <tabbedpane> e o <tab> selecionado. Este método seleciona a aba via programação, alterando o índice do <tabbedpane> por meio do método setInteger() de Thinlet.

 

Listagem 2. agenda_contatos.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

 

<panel columns="1" gap="4">

  <menubar weightx="1">

    <menu text="Arquivo">

      <menuitem text="Cadastro" action="trocarTab(tabs,tabCadastro)" />

      <menuitem text="Relatório" action="trocarTab(tabs,tabRelatorio)" />

      <separator />

      <menuitem text="Sair" action="sair()" />

    </menu>

    <menu text="Ajuda">

      <menuitem text="Sobre" action="exibirSobre()" />

    </menu>

  </menubar>

 

  <tabbedpane name="tabs" weightx="1" weighty="1"

...

Quer ler esse conteúdo completo? Tenha acesso completo