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
[list]
[*] 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
[/list]
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.
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.
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.
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.
- titledPanel.setTitleDarkBackground(new Color(0, 102, 204));
- titledPanel.setTitleLightBackground(new Color(184, 207, 249));
É 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 hyperlink = new JXHyperlink();
- titledPane.addRightDecoration(hyperlink);
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.
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.
- JXHyperlink hyperlinkRF = new JXHyperlink(new LinkAction("Cotidiano em Wonderland", "rfiume.blogspot.com"));
- JXHyperlink hyperlinkMM = new JXHyperlink(new LinkAction("ModelMat Project's Page", "https://modelmat.dev.java.net"));
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.
- class LinkAction extends AbstractAction {
- LinkAction(String linkText, String link) {
- putValue(Action.NAME, linkText);
- putValue(Action.SHORT_DESCRIPTION, link);
- }
- public void actionPerformed(ActionEvent e) {
- String link = (String) getValue(Action.SHORT_DESCRIPTION);
- BareBonesBrowserLaunch.openURL(link);
- }
- }
Customização
Use setClickedColor(Color color) e setUnclickedColor(Color color)
para definir as cores do hyperlink quando clicado e não-clicado respectivamente.
- hyperlinkRF.setClickedColor(new Color(153, 0, 153));
- hyperlinkRF.setUnclickedColor(new Color(0, 51, 255));
[list]
[*]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.
[/list]
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.
Customização
Para mostrar mais de um calendário mensal, use os métodos setPreferredCols(int cols) e setPreferredRows(int rows).
- JXMonthView monthView = new JXMonthView();
- monthView.setPreferredCols(2);
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"});
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.
- monthView.setSelectionMode(JXMonthView.NO_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.
- monthView.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- System.out.println(((JXMonthView) e.getSource()).getSelectedDateSpan());
- }
- });
Problemas ?
É comum destacar dias da semana em calendários, e JXMonthView tem suporte para esse requisito.
- Calendar cal1 = Calendar.getInstance();
- Calendar cal2 = Calendar.getInstance();
- cal1.set(2007, 1, 1);
- cal2.set(2007, 1, 21);
- long[] flaggedDates flaggedDates = new long[] {
- cal1.getTimeInMillis(),
- cal2.getTimeInMillis(),
- System.currentTimeMillis()
- };
- monthView.setFlaggedDates(flaggedDates);
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."
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 datePicker = new JXDatePicker();
- Date date = datePicker.getDate();
- long dateInMillis = datePicker.getDateInMillis();
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.
- datePicker.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent evt) {
- System.out.println(datePicker.getDate().toString());
- }
- });
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.
- datePicker.setFormats(new String [] { "dd/MM/yyyy" });
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.
- datePicker.setLinkDate(System.currentTimeMillis(), "Hoje é dia {0}");
De outra forma, linkPanel pode ser totalmente re-implementado e adicionado à parte de baixo da popup JXMonthView com o método setLinkPanel(JPanel linkPanel).
- datePicker.setLinkPanel(aPanel);
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.
Configuração
Adicione uma imagem ao JXImagePanel com o método setImage(Image image)
- JXImagePanel imagePanel = new JXImagePanel();
- try {
- BufferedImage img = ImageIO.read(
- JXImagePanelTest.class.getResourceAsStream("SoccerDukeSmall.png"));
- imagePanel.setImage(img);
- } catch (Exception e) {
- e.printStackTrace();
- }
Defina se a imagem de JXImagePanel é ou não editável através de setEditable(Boolean editable).
- imagePanel.setEditable(true);?
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.
- imagePanel.setStyle(JXImagePanel.Style.CENTERED);
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.
- JXStatusBar statusBar = new JXStatusBar();
- statusBar.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color(0, 0, 153)));
- statusBar.setLeadingMessage("Concluído");
- statusBar.setTrailingMessage("");
- statusBar.setLeadingMessage("Erro");
- statusBar.setTrailingMessage("RemoteException");
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.
- public class TableInputModel implements TableModel, MessageSource, ProgressSource {
- private final MessageSourceSupport messenger = new MessageSourceSupport(this);
- public void addMessageListener(final MessageListener messageListener) {
- messenger.addMessageListener(messageListener);
- }
- public void removeMessageListener(final MessageListener messageListener) {
- messenger.removeMessageListener(messageListener);
- }
- public MessageListener[] getMessageListeners() {
- return messenger.getMessageListeners();
- }
- public void addProgressListener(final ProgressListener progressListener) {
- messenger.addProgressListener(progressListener);
- }
- public void removeProgressListener(final ProgressListener progressListener) {
- messenger.removeProgressListener(progressListener);
- }
- public ProgressListener[] getProgressListeners() {
- return messenger.getProgressListeners();
- }
- // Executa regress?o linear.
- public void linearRegression() throws CoordinatedNumException, InsufficientDataException {
- // Manda a mensagem para a barra de estado.
- messenger.fireMessage("Running ");
- final LinearRegressionCommand command = new LinearRegressionCommand(matriz);
- commandManager.setCommand(command);
- commandManager.execRegression();
- // Manda outra mensagem para a barra de estado.
- messenger.fireMessage("Done.");
- } // Executa regress?o n?o-linear.
- public void nonLinearRegression() throws CoordinatedNumException, InsufficientDataException {
- // Avisa ao ouvinte que uma longa operaç?o teve início.
- messenger.fireProgressStarted(0, 9);
- final LinearRegressionCommand command = new LinearRegressionCommand(matriz);
- // Avisa que houve um incremento no progresso do método.
- messenger.fireProgressIncremented(2);
- commandManager.setCommand(command);
- messenger.fireProgressIncremented(2);
- commandManager.execRegression();
- messenger.fireProgressIncremented(6);
- // Notifica ao ouvinte que a operaç?o terminou.
- messenger.fireProgressEnded();
- }
- }
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.
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.
- public class JXTipOfTheDayTest {
- private static JXTipOfTheDay tipOfTheDay;
- private JXTipOfTheDayTest() {
- super();
- tipOfTheDay = new JXTipOfTheDay(loadModel());
- }
- private TipOfTheDayModel loadModel() {
- final List tips = Arrays.asList(
- new DefaultTip("Tip1", "Alguma dica aqui!"),
- new DefaultTip("Tip2", "Outra dica "),
- new DefaultTip("Tip3", "Última acho que já é o suficiente."));
- return new DefaultTipOfTheDayModel(tips);
- }
- public static void main(String args[]) {
- java.awt.EventQueue.invokeLater(new Runnable() {
- public void run() {
- new JXTipOfTheDayTest();
- tipOfTheDay.showDialog(null);
- }
- });
- }
- }
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.
- public final class TipOfTheDay {
- private static JXTipOfTheDay tipOfTheDay;
- private TipOfTheDay() {
- super();
- }
- public static void show(final Component parentComponent) {
- final Preferences userPreferences = Preferences.userRoot().node("ModelMat");
- create().showDialog(parentComponent, userPreferences);
- }
- public static void show(final Component parentComponent, final boolean force) {
- final JXTipOfTheDay tip = create();
- final Preferences userPreferences = Preferences.userRoot().node("ModelMat");
- if (force) {
- tip.forceShowOnStartup(userPreferences);
- }
- tip.showDialog(parentComponent, userPreferences, force);
- }
- private static JXTipOfTheDay create() {
- if (tipOfTheDay == null) {
- final Properties prop = new Properties();
- final InputStream input = TipOfTheDay.class.
- getResourceAsStream("/org/modelmat/gui/helper/tip.properties");
- try {
- prop.load(input);
- } catch (IOException ex) {
- ex.printStackTrace();
- return null;
- }
- final TipOfTheDayModel model = TipLoader.load(prop);
- tipOfTheDay = new JXTipOfTheDay(model);
- return tipOfTheDay;
- }
- return tipOfTheDay;
- }
- }
Os tips escritos no aquivo de propriedades devem seguir o padrão abaixo:
- # Pode-se usar tags html no texto da descrição.
- tip.1.description=<html>You can modify the columns names. To do that, select <code>Sheet -> Edit Column Name</code>.</html>
- tip.2.description=Currently, ModelMat can do only the simplest linear and non-linear regression.
- tip.3.name=Tip's Name - Opcional
- tip.3.description=<html>This project is subdivided in two parts: <ul><li>the core system</li> <li>and the graphical user interface (GUI).</li></ul></html>
Finalmente, o método main na classe principal chama show, em TipOfTheDayFactory, para mostrar as dicas ao usuário.
- /* Classe principal em Main, do projeto ModelMat.*/
- public static void main(final String args[]) {
- java.awt.EventQueue.invokeLater(new Runnable() {
- public void run() {
- try {
- UIManager.setLookAndFeel(new Plastic3DLookAndFeel());
- } catch (UnsupportedLookAndFeelException ex) {
- ex.printStackTrace();
- }
- final ModelMat mm = new ModelMat();
- mm.setVisible(true);
- TipOfTheDay.show(mm);
- }
- });
- }
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.
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.
- JXTaskPaneContainer taskPaneContainer = new JXTaskPaneContainer();
- JXTaskPane tpPrincipal = new JXTaskPane();
- JXTaskPane tpCalendario = new JXTaskPane();
- JXMonthView monthView = new JXMonthView();
- JXTaskPane tpSearchUrl = new JXTaskPane();
- JLabel labelURL = new JLabel();
- JTextField tfURL = new JTextField();
- JButton bGo = new JButton();
- // DropShadowBorder faz parte da biblioteca SwingX.
- taskPaneContainer.setBorder(new DropShadowBorder());
- // Define o título.
- tpPrincipal.setTitle("Principal");
- // Define o ícone.
- tpPrincipal.setIcon(newImageIcon(getClass().getResource("/folder_home.png")));
- // Adiciona JXHyperlink's através de subclasses de javax.swing.Action.
- tpPrincipal.add(new IrParaHome());
- tpPrincipal.add(new IrParaCadastroPedido());
- tpPrincipal.add(new IrParaCadastroCompra());
- // Coloca tpPrincipal em taskPaneContainer.
- taskPaneContainer.add(tpPrincipal);
- tpCalendario.setTitle("Calendário");
- // Faz com que o JXTaskPane esteja retraído.
- tpCalendario.setExpanded(false);
- // Adiona JXMonthView, também parte do conjunto de componentes SwingX.
- tpCalendario.add(monthView);
- taskPaneContainer.add(tpCalendario);
- // Apenas um indicador para o UI plugável pintar diferente a área de título do JXTaskPane.
- tpSearchUrl.setTitle("Pesquisar na Web");
- tpSearchUrl.setSpecial(true);
- /*
- * Componentes labelURL, tfURL e bGo adicionados em tpSearchURL
- * através da Matisse do NetBeans.
- */
- taskPaneContainer.add(tpSearchUrl);
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.
- public class IrParaHome extends AbstractAction {
- // Texto que aparece no menu e no hyperlink.
- private static final String NAME = "Home";
- private static final String ACTION = "go_home";
- // Tool tip text.
- private static final String SHORT_DESCRIPTION = "Mostra a tela principal";
- private static final Icon SMALL_ICON;
- static {
- SMALL_ICON = new ImageIcon(IrParaCadastroPedido.class.getResource("/simpletest/taskpane/home.png"));
- }
- public IrParaHome() {
- super();
- putValue(Action.NAME, NAME);
- putValue(Action.SHORT_DESCRIPTION, SHORT_DESCRIPTION);
- putValue(Action.ACTION_COMMAND_KEY, ACTION);
- putValue(Action.SMALL_ICON, SMALL_ICON);
- }
- public void actionPerformed(ActionEvent e) {
- // Lógica de navegaç?o aqui.
- }
- }
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:
[list]
[*] Metal
[*] Windows Classic
[*] Windows Luna
[*] Windows Homestead
[*] Windows Silver
[*] Glossy
[/list]
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
- LookAndFeelAddons.setAddon(MetalLookAndFeelAddons.class);
- // Se a vers?o da JVM for 5.0 ou superior
- UIManager.getLookAndFeelDefaults().put(JXTaskPane.uiClassID,
- "org.jdesktop.swingx.plaf.misc.GlossyTaskPaneUI");
Windows Classic
- UIManager.put("win.xpstyle.name", null);
- LookAndFeelAddons.setAddon(WindowsClassicLookAndFeelAddons.class);
Windows Luna
- UIManager.put("win.xpstyle.name", "luna");
- LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);
Windows Homestead
- UIManager.put("win.xpstyle.name", "homestead");
- LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);
Windows Silver
- UIManager.put("win.xpstyle.name", "metallic");
- LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);
Glossy
- LookAndFeelAddons.setAddon(MacOSXLookAndFeelAddons.class);
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:
[list]
[*] setAnimated () / isAnimated (), que controlam a animação fade-in / fade-out.
[*] setCollapsed () / isCollapsed (), que controlam a retração / expansão do painel.
[/list]
JXCollapsiblePane conta com um Action pronto para uso, que retrai / expande esse componente. Para obtê-lo use:
- JXCollapsiblePane collapsiblePane = new JXCollapsiblePane();
- Action action = collapsiblePane.getActionMap().get("toggle");
JXCollapsiblePane in Action
Na figura abaixo, o painel de listagem dos produtos está retraído.
Após clicar no botão de listagem, o painel começa se expandir.
Finalmente, os " itens cadastrados " tornam-se visíveis.
0 comentários :
Postar um comentário