Javafree

Mergulhando no SwingX

Publicado por Tutoriais Admin em 01/02/2013 - 126.533 visualizações

Por Rafael Fiume

Esse artigo é baseado numa série de publicações sobre SwingX do blog Cotidiano em Wonderland.
Introdução

De acordo com o sítio do SwingX no Java.net,
"[SwingX] contém extensões para o toolkit GUI Swing, incluindo novos e aprimorados componentes que fornecem funcionalidades comumente requisitadas por aplicativos que usem clientes ricos. Destaques incluem":

* Ordenamento, filtragem, destaques (highlighting) para tabelas, árvores (trees) e listas
* Find/Search
* Auto-complemento
* Framework para autenticação/login
* Componente TreeTable
* Collapsible Panel (painel dobrável)
* Componente Date Picker (seletor de datas)
* Componente Tip-of-the-Day (dica-do-dia)

SwingX é um subprojeto do SwingLabs, que conta com suporte da Sun Microsystems e com a participação de alguns dos mais importantes engenheiros da Sun responsáveis pelo Swing.

O SwingLabs serve para implementação e teste de idéias relacionadas à tecnologia voltada para o desenvolvimento de GUI's (Graphical User Interface) para clientes ricos.

Experimentos bem-sucedidos serão considerados para inclusão em versões futuras do JDK (Java Development Kit). O projeto requer ao menos JDK 5 e é licenciado sob LGPL.

Todos os componentes do projeto SwingLabs, incluindo portanto os componentes SwingX, são focados para uso em ambiente de produção. Entretanto, a Sun não oferece qualquer garantia de suporte e desenvolvimento presente ou futuro para qualquer desses componentes.

É importante ressaltar que todos os componentes apresentados nesse artigo foram testados utilizando a versão SwingX 0.8.0. Ao utilizar versões diferentes, existe a possibilidade de algum código presente nesse artigo não funcionar como esperado.

Alguns Componentes SwingX


  • JXCollapsiblePane
  • JXComboBox
  • JXDatePicker
  • JXEditorPane
  • JXErrorPane
  • JXFindBar
  • JXFindPanel
  • JXFrame
  • JXGlassBox
  • JXHyperlink
  • JXImagePanel
  • JXList
  • JXLoginDialog
  • JXLoginPanel
  • JXmonthView
  • JXPanel
  • JXRadioGroup
  • JXRootPane
  • JXSearchPanel
  • JXStatusBar
  • JXTable
  • JXTableHeader
  • JXTaskPane
  • JXTaskPaneContainer
  • JXTipOfTheDay
  • JXTitledPanel
  • JXTree
  • JXTreeTable


SwingX em IDE's

Componentes SwingX são JavaBeans, por isso podem ser adicionados a paleta de componentes de uma IDE (NetBeans, Eclipse, Intellij) e usados para a contrução de GUI's.

Idéias para o Futuro do SwingLabs

O SwingLabs mantém uma página com uma série de idéias para futura implementação - uma espécie de repositório para brainstorming.

Entre essas idéias estão os componentes Application Wellcome Screen (presente nas IDE's NetBeans e Eclipse), JXFontChooser, SpellChecking, JXImgTextField e JXPreferencesDialog.

JXPanel

JXPanel extende JPanel e adiciona suporte para transparência (translucency) e para gradient. Basicamente, JXPanel difere de JPanel porque possui a propriedade alpha.

Usado extensamente pelos componentes SwingX e provável sucessor do JPanel, é difícil encontrar uma utilidade para o uso da transparência em JXPanel.

A figura abaixo mostra um JXPanel contendo um JXMonthView com nenhuma transparência. Ou seja, alpha == 1, que é o valor padrão.

0

Na próxima figura, o JXPanel tem uma transparência de 40%, obtida através de setAlpha(0.6). O valor do parâmetro alpha deve estar entre 0 e 1 inclusive.

0

JXTitledPanel

JXTitledPanel, subclasse de JXPanel, possui uma seção de título e outra seção de conteúdo.

A seção de título possui uma barra em cores degradê, onde define-se o título. É possível adicionar componentes em um de seus cantos, como um JLabel ou JXHyperlink. A seção de conteúdo é usada da mesma forma que um JPanel comum.

0

Customização

Use setTitle(String title) para definir um título

1 JXTitledPanel titledPanel = new JXTitledPanel();
2 titledPanel.setTitle("Seção de Título");


Use os métodos setTitleDarkBackground(Color colorDarkBackground) e setTitleLightBackground(Color colorLightBackground) para definir a cor degradê da seção de título.



É possível inserir qualquer subclasse de JComponent na seção de título. Para isso, use o método addLeftDecoration(JComponent decoration) ou addRightDecoration(JComponent decoration). Pode ser útil colocar um JXHyperlink no canto direito da seção de título.



JXHyperlink

JXHyperlink imita o comportamento dos tradicionais hyperlinks em páginas da Web, oferecendo suporte para rollover e click-color. Extende JButton, diferindo muito pouco de sua superclasse.

JXHyperlink in Action

Na caixa de diálogo About abaixo, há dois hyperlinks: Rafael Fiume e ModelMat 0.3.0. O primeiro leva o usuário diretamente para o blog do desenvolvedor desse software, o segundo, para o sítio do projeto ModelMat.

0

Use o construtor JXHyperlink(Action action) ou o método herdado setAction(Action action) para registrar um ouvinte (listener) para os cliques numa instância de JXHyperlink.



LinkAction identifica a origem do evento - hyperlinkRF ou hyperlinkMM - e delega para BareBonesBrowserLaunch* a execução do navegador padrão. BareBonesBrowserLaunch é uma classe de domínio público.



Customização
Use setClickedColor(Color color) e setUnclickedColor(Color color)
para definir as cores do hyperlink quando clicado e não-clicado respectivamente.




  • Se estiver utilizando o Java SE 6, prefira usar a Desktop API para interagir com aplicativos padrões do sistema operacional nativo, como navegadores de Internet e clientes de e-mail.


JXMonthView

Segundo a documentação do SwingX , JXMonthView é um
componente que mostra um calendário mensal, que pode ser usado para selecionar um dia ou um conjunto de dias. Por padrão, JXMonthView mostrará um calendário simples usando o mês e ano atual e Calendar.SUNDAY como o primeiro dia da semana.

0

Customização

Para mostrar mais de um calendário mensal, use os métodos setPreferredCols(int cols) e setPreferredRows(int rows).



0

JXMonthView pode ser configurado para mostrar outro dia além de Domingo como o primeiro dia da semana.

monthView.setFirstDayOfWeek(Calendar.MONDAY);

É possível mudar a representação dos dias da semana.

monthView.setDaysOfTheWeek(new String[] {"Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"});

0

Seleção de Datas

Há quatro formas possíveis para selecionar datas num componente JXMonthView: NO_SELECTION, SINGLE_SELECTION, MULTIPLE_SELECTION e WEEK_SELECTION. O padrão é JXMonthView.SINGLE_SELECTION.



JXMonthView pode registrar um ouvinte (listener) para ser notificado sempre que o usuário selecionar uma data, ou conjunto de datas, numa instância dessa classe.



Problemas ?

É comum destacar dias da semana em calendários, e JXMonthView tem suporte para esse requisito.



Mas durante os testes, setFlaggedDates() não funcionou - na última figura acima, os dias da semana 1/1/2007, 21/1/2007 e 23/01/2007 (a data atual quando esse artigo foi publicado) não estão destacados em negrito como deveriam. Há um bug impedindo que esse método funcione no SwingX 0.8.0.

JXDatePicker

Segundo sua documentação, JXDatePicker é "um componente que combina um botão, um campo editável e um componente JXMonthView. O usuário pode selecionar a data a partir do componente calendário, que aparece quando o botão é pressionado. A seleção da data no componente calendário será mostrada no campo editável. Uma data também pode ser modificada diretamente a partir do campo editável, usando um dos formatos de datas suportados."

0
A fonte da imagem mostrando o JXDatePicker é Introduction to JXDatePicker
Serviços

Use o método getDate() ou getDateInMillis() para obter a data selecionada.



JXDatePicker dispara ActionEvent's quando uma seleção de data é feita, tanto por meio do componente JXMonthView, quanto do campo de texto. No último caso, como se trata de ActionEvent's, é preciso que o usuário pressione a tecla Enter para que os ouvintes (listeners) registrados sejam notificados do evento.



Customização (1)
É possível customizar o formato aceitável das datas para a caixa de texto do JXDatePicker através dos métodos setFormats(String [] formats) e setFormats(DateFormat [] formats). As strings que compõem o argumento String [] formats devem estar de acordo com o padrão especificado em java.text.SimpleDateFormat.




0

Cada valor no vetor formats é um formato aceitável para a entrada de uma data. Os usuários podem então selecionar datas da forma que melhor lhes convir, seja pelo componente JXMonthView, seja pelo campo de texto e, nesse último caso, com diferentes formatos de datas. Caso o usuário selecione a data pelo componente JXMonthView, JXDatePicker decide em qual formato mostrar a data no campo de texto, entre os vários formatos definidos, pelo valor do primeiro índice do vetor, ou pelo valor que usuário escolheu caso tenha inserido uma data manualmente.

Customização (2)

A mensagem mostrada no linkPanel - o painel mostrado na parte de baixo da popup JXMonthView - pode ser modificada através de setLinkDate(long linkDate, String linkFormatString). O argumento para linkFormatString deve estar de acordo com o padrão de java.text.MessageFormat.



De outra forma, linkPanel pode ser totalmente re-implementado e adicionado à parte de baixo da popup JXMonthView com o método setLinkPanel(JPanel linkPanel).


Problemas ?

Talvez um aplicativo tenha como requisito restringir a seleção de datas de dias passados ou até um certo tempo no futuro. Isso inviabilizará o uso de JDatePicker nesse aplicativo, pois não há como limitar a seleção de uma data nesse componente.

JXImagePanel

JXImagePanel é um JXPanel especial para imagens. Pode ser editável e, nesse caso, permite que o usuário escolha outra imagem através de um JFileChooser.

Futuramente, irá prover mais serviços para manipulação de imagens como tiling, scaling, resizing, cropping (recorte), segways e outros.
0

Configuração

Adicione uma imagem ao JXImagePanel com o método setImage(Image image)



Defina se a imagem de JXImagePanel é ou não editável através de setEditable(Boolean editable).



Serviços

Ajuste o estilo da imagem de um JXImagePanel com o método setStyle(JXImagePanel.Style style). JXImagePanel.Style é um enum com três constantes (na versão SwingX 0.8.0): CENTERED, SCALED e TILED.




JXStatusBar

JXStatusBar é um componente para mostrar mensagens aos usuários. Geralmente, é localizado na parte mais em baixo de uma interface gráfica.

Há dois modos para JXStatusBar relatar informações: atualização manual, ou através de listener API.

JXStatusBar possui o seu próprio gerenciador de layout para organizar os componentes que lhe são adicionados.

JXStatusBar in Action (1)

O meio mais simples e direto de relatar informações na barra de estado JXStatusBar é manualmente, com os métodos setText(String messageText), setLeadingMessage(String messageText) e setTrailingMessage(String messageText).

A diferença entre eles é que setText coloca uma mensagem não transiente no lado direito da barra de estado (status bar), setLeadingMessage coloca a mensagem no canto direito da barra e setTrailingMessage coloca o texto no canto esquerdo.



0



0

JXStatusBar in Action (2)

A outra forma de publicar informações num JXStatusBar é através de listeners API.

As interfaces envolvidas são MessageListener, MessageSource, ProgressListener e ProgressSource. JXStatusBar implementa MessageListener e MessageSource; classes interessadas em publicar informações num JXStatusBar devem implementar MessageSource, ProgressSource, ou ambas.

MessageSource é fonte de MessageEvent's, e ProgressSource é fonte de ProgressEvent's. A classe auxiliar (helper) MessageSourceSupport é conveniente, pois implementa toda a lógica necessária para utilizar listeners API's, como adicionar/remover ouvintes (listeners) e disparar (fire) eventos.

A classe TableInputModel, do projeto ModelMat, implementa MessageSource e ProgressSource através de MessageSourceSupport.



A implementação completa da classe TableInputModel está disponível no repositório do projeto ModelMat.

JXTipOfTheDay

JXTipOfTheDay é a implementação de uma técnica bastante comum para ajudar novos usuários a conhecer um aplicativo. Consiste num painel ou caixa de diálogo com dicas (tips) para ajudar os usuários a descobrir recursos interessantes, aumentar sua produtividade e tirar o melhor proveito desse aplicativo.

0

eralmente, conta com a opção de mostrar ou não a dica do dia - do inglês tip of the day - a cada inicialização do software.

Os tips podem ser definidos direto no código-fonte do software (hard-code), ou através de um arquivo de propriedade.

JXTipOfTheDay in Action (1)

A classe JXTipOfTheDayTest mostra uma caixa de diálogo com as dicas definidas diretamente no código-fonte.




JXTipOfTheDay in Action (2)

A melhor opção pode ser definir tips num arquivo de propriedade.

A classe TipOfTheDay abaixo procura pelas dicas no arquivo tip.properties, armazena a escolha do usuário para mostrar ou não o diálogo na próxima inicialização do aplicativo em Preferences e mostra o diálogo Tip of the Day.



Os tips escritos no aquivo de propriedades devem seguir o padrão abaixo:



Finalmente, o método main na classe principal chama show, em TipOfTheDayFactory, para mostrar as dicas ao usuário.



0

JXTaskPane

Use JXTaskPane para agrupar um conjunto de componentes visuais relacionados com uma mesma tarefa. JXTaskPane fornece controle para expandir e retrair o painel de conteúdo.

Geralmente são agrupados num JXTaskPaneContainer. Consulte JXTaskPaneContainer para entender quais os benefícios de agrupar JXTaskPane's num JXTaskPaneContainer.

0

JXTaskPane criará automaticamente hyperlinks através do método add(javax.swing.Action action).

JXTaskPane in Action

Segue a porção de código relevante para criar os três JTaskPane's agrupados num JXTaskPaneContainer, como na figura ao lado.



Action
Action's são interessantes quando mais de um componentes gráfico executa a mesma função, como pode acontecer com um item de menu e um botão da barra de ferramentas.

Encapsulam num mesmo lugar informações como o texto do menu, ícone pequeno para o menu, ícone grande para a barra de ferramenta, tool tip text e o estado do componente (ativado/desativado).

A classe IrParaHome extende AbstracAction - a implementação padrão da interface Action. Dessa forma, é preciso apenas definir o método actionPerformed() em IrParaHome.

Segue a classe IrParaHome, utilizada no código acima.



JXTaskPaneContainer

JXTaskPaneContainer é feito sob medida para JXTaskPane's que, embora possam ser adicionados em qualquer container, possuem um look and feel mais parecido com o sistema operacional nativo quando estão sobre o JXTaskPaneContainer.


É aconselhável que o JXTaskPaneContainer esteja contido num JScrollPane para que a barra de rolagem vertical apareça nos casos onde o JXTaskPaneContainer não possa ser completamente visível.

Configuração

JXTaskPaneContainer possui seis look and feel's diferentes:


  • Metal
  • Windows Classic
  • Windows Luna
  • Windows Homestead
  • Windows Silver
  • Glossy


0

Veja o demo do SwingLabs para melhor conhecer os seis tipos de L&F's.

Em alguns casos, é possível configurar o JXTaskPaneContainer programaticamente para alterar o look and feel padrão. Para isso, adicione os seguintes códigos na classe que contém o objeto JXTaskPaneContainer.

Metal



Windows Classic



Windows Luna



Windows Homestead



Windows Silver



Glossy



O look and feel Glossy não está disponível no SwingX 0.8.0. Se quiser fazer uso do L&F do Mac OS X, é preciso acessar o repositório do Java.net, módulo swingx, compilar, gerar o arquivo jar e adicioná-lo ao classpath do aplicativo.


JXCollapsiblePane

JXCollapsiblePane extende as funcionalidades de JPanel, acrescentando a capacidade de retração/expansão de sua área de conteúdo, com animação e efeitos do tipo fade-in/fade-out.

A documentação do JXCollapsiblePane tem um exemplo para entender como utilizar JXCollapsiblePane. Os métodos importantes para seu manuseio são:


  • setAnimated () / isAnimated (), que controlam a animação fade-in / fade-out.
  • setCollapsed () / isCollapsed (), que controlam a retração / expansão do painel.


JXCollapsiblePane conta com um Action pronto para uso, que retrai / expande esse componente. Para obtê-lo use:



JXCollapsiblePane in Action
Na figura abaixo, o painel de listagem dos produtos está retraído.

0

Após clicar no botão de listagem, o painel começa se expandir.

0

Finalmente, os " itens cadastrados " tornam-se visíveis.

0

Leia também:
Criando uma Janela Swing
Mergulhando no SwingX
NetBeans 6.5, jtree - treeModel e defaultMutableTreeNode
Tudo sobre o GridBagLayout.



Rafael Fiume, formando pela FATEC (Faculdade de Tecnologia de São Paulo), é consultor, trabalha com desenvolvimento de softwares e gestão de negócios. Pretende, um dia, ser presidente dos Estados Unidos.