Para quem não conhece existe um projeto do qual participei na elaboração e acho bastante útil pra todo mundo. É o GWT Window Manager o projeto consiste basicamente em usar um gerenciador de janelas para a sua aplicação aumentando ainda mais a sensação de se estar usando um desktop em vez do browser. Nesse post vou explicar o básico de como se usar o GWM como é conhecido no seu projeto.
Primeiramente crie um projeto usando o Project Creator e o Application Creator como explicado em posts anteriores. Em seguida acrescente o gwm.jar ao seu classpath e copie o diretório themes para a pasta public do seu projeto, é nela que se encontram todos os arquivos css e de imagem do gwm. Feito isso, o próximo passo é efetuar a ligação entre a página e esses arquivos. Acrescente as seguintes linhas no head do html da página:
[html]
[/xml]
Modificando o código que foi gerado pelo application creator ficamos com o entry point da seguinte forma:
[java]
package br.com.gwt.client;
import org.gwm.client.GDesktopPane;
import org.gwm.client.GInternalFrame;
import org.gwm.client.impl.DefaultGDesktopPane;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Entry point classes define onModuleLoad().
*/
public class GWM implements EntryPoint {
private GDesktopPane desktop;
private static GWM instance;
/**
* This is the entry point method.
*/
public void onModuleLoad() {
instance = this;
desktop = new DefaultGDesktopPane();
RootPanel.get().add((Widget) desktop);
}
/**
* Singleton
* @return
*/
public static GWM getInstance() {
return instance;
}
/**
* Adicione os seus GInternalFrames ao desktop ![]()
* @param iframe
*/
public void addWindow(GInternalFrame iframe) {
desktop.addFrame(iframe);
iframe.setVisible(true);
}
}
[/java]
Agora vejamos alguns detalhes do código:
Primeiramente declaramos que iria ser usado um Desktop, o desktop nada mais é do que um objeto capaz de receber janelas e gerenciá-las. Além disso, implementamos um dos mais usados e simples padrões de projeto um singleton. O Singleton garante que somente uma instancia de um determinado objeto será criado. Como o método onModuleLoad é o primeiro a ser chamado pelo gwt, e somente é executado uma única vez, é bastante adequado inicializar o singleton nesse ponto. No caso de se adicionar construtores ao entryPoint eles devem ser construtores padrão sem argumentos, podendo até mesmo ser privados caso contrário o compilador irá reclamar. Após a execução do onModuleLoad a qualquer momento será possÃvel se obter uma instancia do entryPoint através do método getInstance().
Observem que a inicialização do desktop se dá através da classe DefaultGDesktop o que indica que a classe GDesktop na verdade é uma interface, isso configura um dos vários pontos de extensão do framework. Caso seja necessário implementar um desktop com comportamentos diferentes do original tudo que se tem que fazer após a implementação é alterar esta linha.
Por ultimo, no método onModuleLoad é adicionado esse objeto desktop ao RootPanel, que como já explicado anteriormente, é a página html. Repare aqui que a referência ao desktop não é de um widget, embora a implementação o seja, daà a necessidade do cast.
Agora analisemos o método addWindow(GInternalFrame iframe) ele faz duas coisas:
1. Adiciona o GInternalFrame ao desktop, porém isso não a torna visÃvel;
2. Mostra a janela finalmente. Uma chamada ao método setVisible sem que a janela esteja previamente adicionada a um desktop provocaria uma Exceção em tempo de execução por isso ela só é feita nesse ponto.
Até agora temos uma aplicação com um desktop. Nada além disso, entretanto visualmente já pode-se observado o seguinte:
Entretanto isso não é nem de longe o suficiente para uma aplicação ![]()
Vamos criar pelo menos uma janela e brincar um pouco com ela
Para se criar uma janela que possa ser usada em conjunto com o GDesktop devemos criar uma classe que extenda de DefaultGInternalFrame ou então uma que a implemente, embora eu não recomende a implementação do inÃcio por que a DefaultGInternalFrame já possui bastante funcionalidades e sem contar que você pode extendê-la facilmente.
Assim, vejamos, vamos criar uma janela que possa utilizar o método singleton que criamos anteriormente e que tenha alguma utilidade também
ai vai o código:
[java]
package br.com.gwt.client;
import org.gwm.client.impl.DefaultGInternalFrame;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
/**
* Cria uma janela com um combo box com os temas disponÃveis. Ao selecionar um
* tema diferente altera o desktop completo.
* @author Marcelo Emanoel
*
*/
public class ThemeChanger extends DefaultGInternalFrame {
private ListBox combo;
public ThemeChanger() {
init();
initLayout();
attachListeners();
}
/**
*Inicializa os componentes da janela
*/
private void init() {
combo = new ListBox();
combo.addItem(”default”);
combo.addItem(”alphacube”);
combo.addItem(”citrus”);
combo.addItem(”cloudy”);
combo.addItem(”darkX”);
combo.addItem(”mac”);
combo.addItem(”sky”);
combo.addItem(”spread”);
combo.addItem(”theme1″);
}
/**
*Inicializa o layout da Janela
*/
private void initLayout() {
setCaption(”Seletor de temas”);
setContent(combo);
}
/**
*Adiciona algum possÃvel listener da janela
*/
private void attachListeners() {
combo.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) {
int selecao = combo.getSelectedIndex();
String tema = combo.getValue(selecao);
GWM.getInstance().changeTheme(tema);
}
});
}
}
[/java]
Repare que a janela é a mais simples possÃvel, contém apenas um combobox com o nome dos estilos css que foram adicionados no inÃcio. No método attachListeners acrescentei um ChangeListener ao combobox de maneira que sempre que ouvesse a mudança de valor fosse possÃvel interceptar essa mudança e reagir de alguma maneira, no caso chamei o método getInstance() que retorna a instancia do singleton de GWM e em seguida o método changeTheme passando o valor do combobox. abaixo segue o código que realiza a mudança de tema:
[java]
public void changeTheme(String newTheme){
desktop.setTheme(newTheme);
}
[/java]
Simples e direto. No método initLayout() foi alterada a propriedade Caption que nada mais é senão o TÃtulo da janela e em seguida o conteudo da janela foi setado para ser o combo box. O método utilizado para isso, setContent() foi sobrecarregado de 3 maneiras:
1. Receber um widget, a que provavelmente será a mais usada nas suas aplicações.
2. Receber uma String, supondo que seja de interesse do usuário adicionar somente texto à janela.
3. Receber uma url, também bastante usada para carregar uma página html dentro da janela em si.
Existem também outros métodos que facilitam bastante a vida, como por exemplo, o bloqueio ou não de propriedades como Maximizable, Minimizable, Draggable, Closable. Permitindo ou bloqueando respectivamente, maximizar, minimizar, arrastar e fechar a janela. Além disso, é possÃvel acrescentar ouvintes à janela de maneira a interceptar os eventos anteriores além de outros permitindo uma reação a cada um deles.
Vamos revisitar agora a classe GWM já que vamos adicionar uma janela ao desktop. O código segue abaixo:
[java]
package br.com.gwt.client;
import org.gwm.client.GDesktopPane;
import org.gwm.client.GInternalFrame;
import org.gwm.client.impl.DefaultGDesktopPane;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Entry point classes define onModuleLoad().
*/
public class GWM implements EntryPoint {
private GDesktopPane desktop;
private ThemeChanger themeChanger;
private static GWM instance;
/**
* This is the entry point method.
*/
public void onModuleLoad() {
instance = this;
desktop = new DefaultGDesktopPane();
themeChanger = new ThemeChanger();
changeTheme(”default”);
addWindow(themeChanger);
RootPanel.get().add((Widget) desktop);
}
/**
* Singleton
* @return
*/
public static GWM getInstance() {
return instance;
}
/**
* Adicione os seus GInternalFrames ao desktop ![]()
* @param iframe
*/
public void addWindow(GInternalFrame iframe) {
desktop.addFrame(iframe);
iframe.setVisible(true);
}
public void changeTheme(String newTheme){
desktop.setTheme(newTheme);
}
}
[/java]
Veja que criamos uma instancia da janela ThemeChanger e a adicionamos ao desktop. Feito isso é só atualizar a página do projeto e finalmente ver a janela em ação.
A janela por default pode ser maximizada, minimizada, fechada e ser arrastada. Aproveitem e brinquem um pouco.
Segue o código implementado no post. Aguardo comentários!
12 Responses to “Utilizando o Gwt Window Manager”
Leave a Reply
You must be logged in to post a comment.
Março 5th, 2008 at 14:27:26
Esse projeto, o GWM é muito legal.
A começar pelo próprio demo na homepage do projeto.
Uma coisa que a gente podia pensar em discutir nas próximos posts era como construir um sistema de informação padrão (paradigma CRUD) com o GWT.
Março 5th, 2008 at 21:27:16
Com certeza está nos planos implementar uma aplicaçãozinha que mexa com o básico de crud, inclusive com hibernate ou jpa
Por enquanto vou mostrando o básico para ir aumentando o nÃvel aos poucos
Março 6th, 2008 at 13:13:58
Fala marcelo, primeiramente parabéns pelo projeto GWM. Estou com uma dúvida, quando vc escolhe o tema, o GWM reproduz o tema em efeito cascata para os “componentes filhos” da desktop como botões, ou outros widgets por exemplo, ou só para as janelas?
Maio 23rd, 2008 at 13:32:07
Olá. Desde já parabéns! Deixa-me apenas dizer-te que existe um pequeno bug no código final: aquilo que é feito em onModuleLoad() nunca é guardado pois não estás a guardar a instância. Falta:
instance = this;
tal como está no primeiro exemplo.
Fica bem.
Silvestre Martins
Junho 3rd, 2008 at 17:49:52
existe esse framework tbm: extjs.com
pra projetos open source é free
flw
Junho 6th, 2008 at 17:08:23
Fala Fabrício é o seguinte, a atualização do css é repassada para a janela e o desktop que são os únicos componentes que o framework tem controle… os demais componentes não sofrem alteração alguma.
Abração
Junho 6th, 2008 at 17:09:40
Opa silmarx valeu aê pela correção. Na verdade passou despercebido mas está valendo
problema corrigido, vamos ao próximo post 
Abraço
Julho 5th, 2008 at 18:29:50
Marcelo, parabens pelo tópico, mas fica uma duvida (de iniciante): como eu faço para trocar o papel de parede do desktop pane? É possível?
Julho 5th, 2008 at 19:26:27
Oi Thiago, para trocar o papel de parede do desktop o que você precisa fazer é acrescentar uma classe ao seu arquivo de estilos.
.gwm-default-GDesktopPane-FrameContainer{
background-color: black;
}
por exemplo… o código acima faz com que caso o tema escolhido seja o default o papel de parede fique preto. Além do papel de parede é possível estilizar a barra que serve de container para as janelas minimizadas.
.gwm-default-GDesktopPane-TaskBar{
}
caso você esteja utilizando outro tema substitua o default pelo nome do tema.
Julho 17th, 2008 at 09:28:08
Bom dia, eu postei algumas perguntas aqui mas até o momento não obtive resposta, mas como credito nesse projeto vai ai denovo.
Eu consigo desenhar a interface gráfica via eclipse ou NetBeans, caso sim gostaria de um exemplo passo-a-passo.
Agradeço desde já.
Julho 17th, 2008 at 10:21:23
Oi Emerson, é possÃvel desenvolver a interface gráfica via qualquer IDE ou mesmo notepad caso queira… mas caso você esteja procurando por alguma coisa ao estilo RAD (arrastar e soltar) existem algumas IDE’s e/ou plugins que facilitam as coisas nesse sentido. Para o netbeans existe o NB4GWT que é um plugin que faz isso. Caso não se importe em pagar por um produto, existe o VistaFei da Wirelex Software ele é uma customização do eclipse com um editor gráfico semelhante ao do netbeans para java. Pessoalmente eu prefiro desenvolver meus projetos em GWT sem plugins a exceção dos plugins que lidam com CSS e HTML (no meu caso é o WTP mas pode usar qualquer um… que vai ter o mesmo efeito
).
Julho 24th, 2008 at 21:04:27
Marcelo,
Baixei a versão 0.6.6 do GWM e fiz exatamente como descrito acima, porém no momento de executar a aplicação é exibido apenas uma faixa preta no cabeçalho da página. Talvez seja uma imcompatibilidade da nova versão com o exemplo feito por vc. Estou fazendo meu TCC com base no GWT e seria de grande valia a utilização desse projeto.
Agradeço desde já!
Parabéns pelo Site, acho que é por aí mesmo! e viva o software livre…