Testando o OpenSwing

Um amigo meu me falou de um framework que ele ouviu falar muito bem para aplicações desktops chamando OpenSwing. Fiquei curioso e resolvi testar. Segundo o site, o OpenSwing é um conjunto de componentes gráficos avançados de código aberto baseados no Swing. Além disso, é um framework com suporte a binding entre o modelo de dados e componentes baseado em MVC. Parece promissor.

Baixei o Netbeans 6.8 completo (as versões 6.9.x e 7.0 estão com problemas ao editar a parte gráfica) e o framework. Instalei o Netbeans e descompactei o OpenSwing. Apesar da versão no site ser recente, a documentação está bastante desatualizada. O Netbeans utilizado na documentação é o 4.1... muito antigo. Pela especificação, os componentes seguem os padrões JavaBeans, portanto creio que não deva ser um problema para todas as versões do Netbeans e outras IDEs. Vamos aos passos para configuração.

Inicie o Netbeans, crie um novo projeto: clique em File, New Project, Java Application, Next. Eu não selecionei o Java Desktop Application porque ele utiliza o Swing Application Framework JSR-296 (não é o Swing!). Esse framework está inativo pela JCP. Em Project Name, coloque um nome, no meu caso coloquei: TestOpenSwing. Desmarque a opção de criar uma classe Main (Create Main Class). Clique em Finish.

Selecione Tools, Libraries, New Library. Coloque um nome, como OpenSwing e pressione OK. Clique em Add JAR/Folder. Selecione todos os jars da pasta build do OpenSwing e pressione OK.

Library Manager
Library Manager

Biblioteca configurada! Agora vamos adicionar os componentes à palheta. Selecione Tools, Palette, Swing/AWT Components. Clique em New Category e nomeie: OpenSwing. Selecione a categoria criada e clique Add from Library. Selecione OpenSwing, Next, marque todos, Next, selecione OpenSwing, Finish e Close.

Palette Manager
Palette Manager

Outra configuração recomendada é alterar o comportamento do designer do Netbeans ao trabalhar com grid control. Para isso, selecione Tools, Options, Miscellaneous, GUI Builder, Altere o Layout Generation Style para Standard Java 6 Code e pressione OK. Configurações na IDE feitas, vamos à configuração do Projeto e criação de uma aplicação exemplo. Clique com o botão direito no seu projeto, Properties, Libraries, Add Library, OpenSwing, Add Library, Ok.

Project Properties
Project Properties

Vamos criar um frame MDI. Para isso é necessário criar uma classe que implemente a interface MDIController e pronto. Segue o código e o screenshot abaixo:

[cc lang="java"]
package br.com.thiagovespa.samples.openswing;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import org.openswing.swing.internationalization.java.BrazilianPortugueseOnlyResourceFactory;
import org.openswing.swing.internationalization.java.Language;
import org.openswing.swing.mdi.client.ClientFacade;
import org.openswing.swing.mdi.client.MDIController;
import org.openswing.swing.mdi.client.MDIFrame;
import org.openswing.swing.mdi.java.ApplicationFunction;
import org.openswing.swing.tree.java.OpenSwingTreeNode;
import org.openswing.swing.util.client.ClientSettings;

/**
* Sample App
* @author Thiago Galbiatti Vespa
*/
public class MainApplicationMDI implements MDIController {

public MainApplicationMDI() {
try {
Properties props = System.getProperties();
ClientSettings clientSettings = new ClientSettings(new BrazilianPortugueseOnlyResourceFactory(props, false), new Hashtable());
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
MDIFrame mdi = new MDIFrame(this);
} catch (ClassNotFoundException ex) {
Logger.getLogger(MainApplicationMDI.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(MainApplicationMDI.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(MainApplicationMDI.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedLookAndFeelException ex) {
Logger.getLogger(MainApplicationMDI.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void afterMDIcreation(MDIFrame frame) {
}

public String getAboutImage() {
return null;
}

public String getAboutText() {
return "Esse software foi feito por Thiago Galbiatti Vespa\n"
+ "para demonstrar o uso do Open Swing";
}

public DefaultTreeModel getApplicationFunctions() {
DefaultMutableTreeNode root = new OpenSwingTreeNode();
DefaultTreeModel model = new DefaultTreeModel(root);
ApplicationFunction node1 = new ApplicationFunction("Primeira função", "primeira", "men.gif", null, "Esse botão executa a primeira função");
ApplicationFunction node2 = new ApplicationFunction("Segunda função", "segunda", "appicon.gif", null, "Esse botão executa a segunda função");
ApplicationFunction node2_1 = new ApplicationFunction("Função interna", "interna", "men.gif", null, "Esse botão executa a função interna");
node2.add(node2_1);
root.add(node1);
root.add(node2);
return model;
}

public ClientFacade getClientFacade() {
throw new UnsupportedOperationException("Not supported yet.");
}

public int getExtendedState() {
return JFrame.MAXIMIZED_BOTH;
}

public ArrayList getLanguages() {
ArrayList list = new ArrayList();
list.add(new Language("PT_BR", "Português do Brasil"));
return list;
}

public String getMDIFrameTitle() {
return "Aplicação Exemplo do Open Swing";
}

public void stopApplication() {
System.exit(0);
}

public boolean viewChangeLanguageInMenuBar() {
return true;
}

public boolean viewFileMenu() {
return true;
}

public boolean viewFunctionsInMenuBar() {
return true;
}

public boolean viewFunctionsInTreePanel() {
return true;
}

public JDialog viewLoginDialog(JFrame parentFrame) {
return null;
}

public boolean viewLoginInMenuBar() {
return false;
}

public boolean viewOpenedWindowIcons() {
return true;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainApplicationMDI();
}
});
}
}
[/cc]

Aplicação Exemplo do OpenSwing
Aplicação Exemplo do OpenSwing

Esse é um exemplo simples, para exemplos completos, consulte a pasta srcdemo do OpenSwing.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6