Herança Classe Shell

6 respostas
R
package gui;

import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;

public class Application extends ApplicationWindow {
  
  public Application(){
	  super(null);
  }
  
  @Override
  protected Control createContents(Composite parent){
	  getShell().setLayout(null);
	  getShell().setMaximized(true);
	  Button button = new Button(getShell(),SWT.PUSH);
	  button.setBounds(10,10,100,35);
	  button.setText("Clique Aqui");
	  
	  button.addSelectionListener(new SelectionAdapter() {
	   @Override
	   public void widgetSelected(SelectionEvent event){
		   
	   }});
	  return parent;
	  }
 
public static void main(String[] args) {
	  ApplicationWindow window = new Application();
	  window.setBlockOnOpen(true);
	  window.open();
	  Display.getDefault().dispose();
	  };
}
Boa dia a todos. Fiz essa classe conforme algumas leituras que encontrei. Até ai beleza. A Aplicacação roda normalmente. Ai criei outra classe que herda da Classe Shell do SWT. Ficou assim
package gui;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TForm extends Shell {

	public TForm() {
	}

	public TForm(int arg0) {
		super(arg0);
	}

	public TForm(Display arg0) {
		super(arg0);
	}

	public TForm(Shell arg0) {
		super(arg0);
	}

	public TForm(Display arg0, int arg1) {
		super(arg0, arg1);
	}

	public TForm(Shell arg0, int arg1) {
		super(arg0, arg1);
	}

}
ai Na parte do código da primeira classe,
@Override
	   public void widgetSelected(SelectionEvent event){
		TForm form = new TForm(getShell());
		form.open();  
	   }});
Esse código compila mas gera erro,o seguinte erro
org.eclipse.swt.SWTException: Subclassing not allowed
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.widgets.Widget.error(Unknown Source)
	at org.eclipse.swt.widgets.Decorations.checkSubclass(Unknown Source)
	at org.eclipse.swt.widgets.Shell.<init>(Unknown Source)
	at org.eclipse.swt.widgets.Shell.<init>(Unknown Source)
	at org.eclipse.swt.widgets.Shell.<init>(Unknown Source)
	at gui.TForm.<init>(TForm.java:20)
	at gui.Application$1.widgetSelected(Application.java:29)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:561)
	at org.eclipse.jface.window.Window.open(Window.java:541)
	at gui.Application.main(Application.java:38)
não entendo porque, eu herdei a classe shell e chamo o construtor da classe pai. teoricamente era para funcionar se eu faço assim funciona corretamente;
public void widgetSelected(SelectionEvent event){
		  Shell form = new Shell(getShell());
		  form.open();
	   }});
Ou seja a classe que eu quero criar que herda de shell, gera a exception. Só não entendo porque pois estou chamando o constructor da classe pai, no constructor da minha classe. alguém sabe oque fazer

6 Respostas

eltonads

Cara,

Normalmente não se usa herança pra trabalhar com Shell… Maaaas… Se você quer fazer assim você pode simplesmente sobrescrever o método checkSubclass:

@Override
protected void checkSubclass() {
// nop
}

Fontes:
http://osdir.com/ml/ide.eclipse.platform.swt.devel/2007-07/msg00008.html
http://www.eclipse.org/swt/faq.php#subclassing

R

a Intenção era de fazer o seguinte criar uma classe TForm com alguns métodos que facilita-se mostras o form, ai eu criaria outros forms herdando dessa classe Tform exemplo FrmCadastro que herda da classe TForm.
Ai nessa classe FrmCadastro por exemplo eu coloco os components que eu quero, label, button, table, treeview, esses e coloco tb os métodos ficam disitribuidos na classe , com seus listener e evetos.
Então minha aplicação ficaria assim.
A classe Aplication como a principal, e chamaria os forms onde cada um seria uma classe com seus métodos.

O SWT é melhor e mais rápido que o swing, Opinião minha, porém se vc só usar o SWT fica meio ruim de programar, pois tem que colocar tudo os objetos dentro da função main.

Ai tem o Jface que facilita. Agora vamos supor quero fazer uma aplicação, MDI um form principal, e os outros filhos dele, se eu usar o shell que nem eu mostrei num trecho do código, vamos supor que eu tenha um form de cadastro de clientes com 30 campos, instanciar cada 1, posicionar, isso tudo dentro do metodo fica um código meio feio.
Se existe uma outra forma eu desconheço, material de SWT é meio escasso e maioria sempre dão os mesmo exemplos.

No caso de fazer uma aplicação com multiplos forms em SWT como faria?

eltonads

Mas funcionou sobrescrevendo o checkSubclass?
E realmente, o material sobre SWT é muito escasso, e muitas vezes pouco claro… Resta à comunidade vontade pra mudar isto =)

Se alguém conhecer um material bom sobre o assunto, por favor indique!

Att.,

R

assim sobreescrever uma método eu sei.
Mas que esse método iria fazer. Isso eu nem imagino.

eltonads

Acho que a idéia é só sobrescrever… Mas deixar ele vazio…
A implementação original que causa o disparo da exceção que era o seu problema.
Bom… Não testei… Mas acredito que seja isso =)

R

Testei e deu certo. Valeu!

Criado 26 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 6
Participantes 2