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.
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.
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.
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]
Esse é um exemplo simples, para exemplos completos, consulte a pasta srcdemo do OpenSwing.
Thiago pela sua experiencia oque achou do OpenSwing ?
Vale a pena estudar ele , ou melhor ficar no Swing ?
Sou meio novo em programação e sou cheio de duvidas sobre isso
Vale a pena sim. Algumas coisas eu não gostei dele, por exemplo a execução de métodos dentro do construtor automaticamente: se eu quero construir uma janela e depois torná-la visível, o OpenSwing ao instanciar essa nova janela ele já chama o método dentro do construtor para deixá-la visível.
Como o openswing é código aberto e fácil de programar e alterar. Vale a pena utilizar ele pra agilizar o desenvolvimento.
Olá Thiago,
Estou desenvolvendo uma aplicação no NetBeans e estou usando o framework OpenSwing, só que a nova versão do NetBeans 6.9.1 acredito que está dando uma incompatibilidade com o OpenSwing pois quando tendo abrir um jframe ele trava e fica carregando e não consigo mas mexer e tenho que finalizar o NetBeans no gerenciador de tarefas, porém se eu remover a paleta do OpenSwing ele abre o jframe normal, por acaso você saberia alguma solução para poder me ajudar a resolver este problema?
Desde já agradeço.
Att. Eliane Cavalheiro
Estou utilizando o Netbeans 6.9.1 também, sem nenhum problema. Teria como você enviar o código pra mim?
Olá Thiago. Obrigado pela atenção!!!
Acredito que o problema não esteja no código porque se eu criar um novo projeto, criar um novo JFrame ele ja da pau, fica carregando e trava o NetBeans, tenho que fechar pelo gerenciador de tarefas, ou seja nem tem codigo ainda.
Tem alguma configuração adicional que você faz quando instala o NetBeans ou o OpenSwing??
Eu instalei a jdk-6u21-windows-i586, NetBeans 6.9.1 e depois adicionei a biblioteca do OpenSwing(todos os jar da pasta build) e então adicionei a paleta dos componentes.
A única configuração adicional que eu fiz foi alterar o comportamento do designer: última parte desse post.
Outra coisa.. utilizando o OpenSwing você não precisa mais criar JFrame. Instalei em uma outra máquina e deu esse problema. Vou ver o que é e lhe informo.
Ok Thiago muito obrigada,
Valeu pela força. Aguardo sim.
O problema se repete com o Netbeans 7 beta. A recomendação atual é utilizar o Netbeans 6.8.
Boa tarde pessoal.
Eu estava com o mesmo problema, apenas realizei o procedimento de atualização automática no netbeans e o problema foi solucionado.
Aqui em uma máquina deu certo e na outra não... ainda não descobri o motivo, mas com o 6.8 o problema sumiu nas duas
Então no windows esta funcionando redondo, no linux ubuntu 10.10 fiz o mesmo procedimento, mas o travamento ainda persiste... Vai saber o que pode ser...
[...] Testando o OpenSwing: 11 comentários [...]
Thiago,
Excelente artigo.
Você já se deparou com a necessidade de passar parâmetros aos métodos do clientfacade?
Você saberia resolver o problema?
Exemplo:
Na classe ClientFacade eu tenho o método Metodo1(String param1){}.
Quando construo o ApplicationFunction, no parâmetro "String methodname", como devo referenciar o método acima?
Nos casos comuns - quando não há parâmetros a serem informados - basta eu passar como string, o nome do método, e tá tudo resolvido. Contudo não acho exemplos de como passar parâmetros (e se isto é possível).
Já tentei "Metodo(\"Param1\")" mas não adianta.
Agradeço a ajuda.
Nunca me deparei com esse problema. O parâmetro é realmente necessário? Você não pode passar via construtor do ClientFacade? Ou pegar a instância do ClientFacade e setar um outro método em outro local, sem ser na chamada do ApplicationFunction e recuperar posteriormente?
Olá Thiago, seguinte, meu netbeans 6.9.1 estava travando, procurei na internet e achei essa página com o tutorial do openswing e algo sobre o travamento, realizei a atualização e o problema havia sido resolvido, agora voltou novamente, não consigo mais mexer nele com interface gráfica, tem idéia de como resolver ou vamos continuar por muito tempo ainda com o netbeans 6.8?
Obrigado desde já...
Ótimo hello OpenSwing 😉
Olá Thiago...
Bom eu estou desenvolvendo um sistema e eu queria mudar o layout dos botões, assim como eu fiz com o lookandfeel, dexar ele com uma cara diferente. Tem alguma coisa que eu posso fazer, alguma biblioteca para baixar?
Muito obrigado..
Thiago, que tal postar um exemplo de uma aplicação 3 camadas usando com o OpenSwing 🙂 ?
Boa tarde Thiago, estou estudando o openswing, porem ao tentar utilizar FormattedTextControl no netbens no modo visual, ele dá um erro dentro do netbeans, somente com este componente, existe alguma solução para este problema ??
Muito obrigado.
Qual erro ocorre?
Thiago bom dia, prezado achei otimo este seu post, tava procurando uma ferramenta com estas caracteristicas, então baixei e comecei .... mais tive dois problemas o primeiro qdo chamo a tela de login se colocar apenas tres parametros LoginDialog(parentFrame,Null,This) tudo Ok , se colocar mais parametros a tela aparece mais os campos texto não. o Outro é a grade , a propriedade ValueObjectClassName esta com a minha classe VO br.com.contatos.vo.EstadoVO, mais as colunas elas não apresentam para escolha os atributos em columnName, bem ao executar a aplicação e chamar a tela no menu recebo uma mensagem de erro que acredito que possa ser em consequencia disto.
java.lang.IllegalAccessException: Class org.openswing.swing.mdi.client.MDIFrame$12 can not access a member of class br.com.contatos.main.ClienteFachada with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
Será q vc poderia me sugerir algo?
Teria como me enviar o código de ClienteFachada?
Thiago boa tarde, prezado desculpa a demora ( e eu que sou o interessado.... ) e obrigado ai pelo contato, mais foi erro na minha digitação do metodo, e a grade bem ao sair e entrar novamente a propriedade já ficou visivel agora tudo Ok, consegui desenvolver aqueles projetos de exemplo sabe agenda, contatos, baseado no demo10, ficou ok ...
Como eu venho tentando aprender java e meu projeto de aprendizado usa JSF 2 no Tomcat é natural que eu tente agora fazer um projeto 3 camadas, vi que existe o demo5 e o demo18 mais, não comenta como ( já procurei ) como montar o projeto, veja qual é minha duvida.... como já fiz um projeto web sei q ele tem estrutura diferente de um projeto Java, então com o OS em 3 camadas vou ter um projeto web?, um projeto Java? tô com esta duvida e nem no livro nem no site demonstra como iniciar, sera que farei um projeto java so com a classe cliente e comum? para gerar um jar e colocar em um projeto web? o ruim é que não tem nenhum projeto exemplo para baixar, tem os fontes ok mais mesmo assim tô meio que perdido em como fazer.
Robson
Olá.
Sou novo em java, e pretendo fazer meu tcc utilizando o OpenSwing.
Realizei a instalação como voce ensinou, mas ao arrastar um componente na tela, ocorre o seguinte erro:
"Impossivel carregar a classe de componente NOMEDOCOMPONENTE do(a) biblioteca do IDE: OpenSwing.
A classe só deve ser compilada e deve estar no caminho da classe do projeto ao qual este formulario pertence "
estou tutlizando o netbeans 6.8 no windows 7
sabe me dizer qual o problema?
abraço!
Bom dia!
Thiago, estou utilizando o OpenSwing e me deparei com um problema no código. Tenho uma decimalColunm com 3 casas decimais e marquei o parâmetro selectDataOnEdit, porem não esta funcionando corretamente. No método _prepareEditor da classe NumericCellEditor ele faz um cast para Numbem e então um número que é 2.000 fica 2.0 e ai na hora de selecionar o texto ele pega somente os três primeiros ficando 2 zeros para traz. Não sei se dar para entender.
O que eu preciso na verdade é de umas dicas para alterar o código do OpenSwing, como eu poderia fazer isto, que passos devo tomar.
Abraço!
Amigo, tem como mostrar este exemplo no Eclipse?
Instalei o frame no eclipse mas este exemplo que mostrou ai acima não funciona no mesmo.
Seria possível vc fazer para nos?
Abraço.
Boa tarde Thiago, eu estou usando o OpenSwing e estou com um problema, tenho várias telas grid e nelas tem o campo LookupColumn, e ontem me deparei com um fato que quando eu altero alguma coisa na grid tipo Uf= AL mudo para RS ele altera todos os campos que forem igual a AL e não somente um especifico, você por acaso saberia alguma solução para resolver este problema?
gostaria de colocar uma imagem de fundo, mas nao consigo....
pode me ajudar?
Imagem de fundo onde?
Bom dia!
Utilizo o OpenSwing há algum tempo e sempre tive um problema com ele. Em algumas situações ele trava e não é possível fazer nada a não ser ir no gerenciador de tarefas do Windows e finalizar a aplicação. Efetuado alguns testes, descobri que isto ocorre quando a maquina cliente perde a comunicação com o servidor. A questão não é ele dar erro, se perdeu a conexão não tem o que fazer, o problema é ele ficar travado sem dar mensagem ou algum timeout. Será que tem alguma solução que não visualizei?
Utilize threads para efetuar qualquer tipo de conexão ou atividade demorada. Assim você evita esse problema de travar.
Maravilha Thiago, vou efetuar os teste. Obrigado!!