Metodo dispose() não funciona com SWT

Estou fazendo um Login e quando coloco this.dispose(); dá a mensagem “The method dispose() is undefined for the type new SelectionAdapter(){}”.

como posso fazer para fechar esta janela sem fechar o programa todo?

deixo aqui o codigo:

public class MenuLogin {

protected Shell shlSge;
private Text user;
private Text pass;

/**
 * Launch the application.
 * @param args
 */
public static void main(String[] args) {
	try {
		MenuLogin window = new MenuLogin();
		window.open();
	  }
	catch (Exception e) {
		e.printStackTrace();
	}
}


/**
 * Open the window.
 * @throws IOException 
 */
public void open() throws IOException {
	Display display = Display.getDefault();
	createContents();
	shlSge.open();
	shlSge.layout();
	while (!shlSge.isDisposed()) {
		if (!display.readAndDispatch()) {
			display.sleep();
		}
	}
}

/**
 * Create contents of the window.
 */
protected void createContents() throws java.io.IOException{
	shlSge = new Shell();
	shlSge.setImage(ResourceManager.getImage("Logo25x25.jpg"));
	shlSge.setSize(450, 300);
	shlSge.setText("SGE");
	
	Label lblUtilizador = new Label(shlSge, SWT.NONE);
	lblUtilizador.setBounds(136, 75, 55, 15);
	lblUtilizador.setText("Utilizador");
	
	Label lblPassword = new Label(shlSge, SWT.NONE);
	lblPassword.setBounds(136, 111, 55, 15);
	lblPassword.setText("Password");
	
	final Label lblEUser = new Label(shlSge, SWT.NONE);
	lblEUser.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblEUser.setBounds(298, 69, 100, 15);
	
	final Label lblEPass = new Label(shlSge, SWT.NONE);
	lblEPass.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblEPass.setBounds(298, 108, 100, 15);
	
	final Label lblELogin = new Label(shlSge, SWT.NONE);
	lblELogin.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblELogin.setBounds(141, 215, 151, 15);

	user = new Text(shlSge, SWT.BORDER);
	user.setBounds(216, 69, 76, 21);
	
	
	pass = new Text(shlSge, SWT.PASSWORD | SWT.BORDER);
	pass.setBounds(216, 108, 76, 21);
	
	Button btnOK = new Button(shlSge, SWT.NONE);
	btnOK.setBounds(136, 163, 75, 25);
	btnOK.setImage(SWTResourceManager.getImage("Entrar.png"));
	btnOK.setText("Entrar");
	btnOK.addSelectionListener(new SelectionAdapter() {
		@Override
		public void widgetSelected(SelectionEvent e) {
			lblEUser.setText("");
			lblEPass.setText("");
			lblELogin.setText("");
			String nutil = user.getText();
			String ppass = pass.getText();
			
			Shell shell = null;
			if(nutil==""){ 
				lblEUser.setText("Insira o username");
			}
			if(ppass==""){
				lblEPass.setText("Insira a password");
			}
			else
			{
			try{
				Scanner ler= new Scanner(new File("utilizadores.txt"));
				String[] linha;
				while(ler.hasNextLine()){
					linha = ler.nextLine().split(":");  
					String NomeNoFicheiro=linha[0];
					String PasswordNoFicheiro=linha[1];
					String NomeUtilizadorNoFicheiro=linha[2];
					String Cat=linha[3];
	              
					if(nutil.equals(NomeNoFicheiro)&&ppass.equals(PasswordNoFicheiro))//verifica se o username coicide com a password 
					{
						
							switch (Cat){
								case "D":      //categoria alunos         

// Menus CMenuAlunos=new Menus();
// CMenuAlunos.MenuAluno(NomeUtilizadorNoFicheiro);
System.out.println(“Falta acabar”);
break;

								case "C"://categoria profs
									MenuDocentes MDocen= new MenuDocentes();	
									MDocen.open();
									break;
		                   
								case "B"://categoria profs responsaveis
									MenuDocentesResp MDocenR= new MenuDocentesResp();	
									MDocenR.open();
									this.dispose(); // [b]É esse que dá erro[/b]
									break;
		                  
								case "A"://categoria Funcionarios
									System.out.println("Falta acabar");
									break;
								default:
									System.out.println("Falta acabar");
									break;
		         
							}
						}
						else       
							lblELogin.setText("O utilizador não existe");
					}
		            ler.close(); 
				}  
				catch(FileNotFoundException e1){
					System.out.println(e1.getMessage());
				}         
			}
		}
	});
	
			
	Button btnSair = new Button(shlSge, SWT.NONE);
	btnSair.setBounds(217, 163, 75, 25);
	btnSair.setImage(SWTResourceManager.getImage("Sair.png"));
	btnSair.setText("Sair");
	btnSair.addSelectionListener(new SelectionAdapter() {
		@Override
		public void widgetSelected(SelectionEvent e) {
			System.exit(0);
		}
	});
	
	Label lblLogo = new Label(shlSge, SWT.NONE);
	lblLogo.setAlignment(SWT.CENTER);
	
	lblLogo.setImage(ResourceManager.getImage("Logo100x100.jpg"));
	lblLogo.setBounds(10, 69, 100, 100);
	
	
	
	
}

}

obgdo

Coloque seu codigo dentro da tag CODE, isso facilita a leitura do mesmo.

[code]
public class MenuLogin {

protected Shell shlSge;
private Text user;
private Text pass;

/**
 * Launch the application.
 * @param args
 */
public static void main(String[] args) {
	try {
		MenuLogin window = new MenuLogin();
		window.open();
	  }
	catch (Exception e) {
		e.printStackTrace();
	}
}


/**
 * Open the window.
 * @throws IOException 
 */
public void open() throws IOException {
	Display display = Display.getDefault();
	createContents();
	shlSge.open();
	shlSge.layout();
	while (!shlSge.isDisposed()) {
		if (!display.readAndDispatch()) {
			display.sleep();
		}
	}
}

/**
 * Create contents of the window.
 */
protected void createContents() throws java.io.IOException{
	shlSge = new Shell();
	shlSge.setImage(ResourceManager.getImage("Logo25x25.jpg"));
	shlSge.setSize(450, 300);
	shlSge.setText("SGE");
	
	Label lblUtilizador = new Label(shlSge, SWT.NONE);
	lblUtilizador.setBounds(136, 75, 55, 15);
	lblUtilizador.setText("Utilizador");
	
	Label lblPassword = new Label(shlSge, SWT.NONE);
	lblPassword.setBounds(136, 111, 55, 15);
	lblPassword.setText("Password");
	
	final Label lblEUser = new Label(shlSge, SWT.NONE);
	lblEUser.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblEUser.setBounds(298, 69, 100, 15);
	
	final Label lblEPass = new Label(shlSge, SWT.NONE);
	lblEPass.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblEPass.setBounds(298, 108, 100, 15);
	
	final Label lblELogin = new Label(shlSge, SWT.NONE);
	lblELogin.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
	lblELogin.setBounds(141, 215, 151, 15);

	user = new Text(shlSge, SWT.BORDER);
	user.setBounds(216, 69, 76, 21);
	
	
	pass = new Text(shlSge, SWT.PASSWORD | SWT.BORDER);
	pass.setBounds(216, 108, 76, 21);
	
	Button btnOK = new Button(shlSge, SWT.NONE);
	btnOK.setBounds(136, 163, 75, 25);
	btnOK.setImage(SWTResourceManager.getImage("Entrar.png"));
	btnOK.setText("Entrar");
	btnOK.addSelectionListener(new SelectionAdapter() {
		@Override
		public void widgetSelected(SelectionEvent e) {
			lblEUser.setText("");
			lblEPass.setText("");
			lblELogin.setText("");
			String nutil = user.getText();
			String ppass = pass.getText();
			
			Shell shell = null;
			if(nutil==""){ 
				lblEUser.setText("Insira o username");
			}
			if(ppass==""){
				lblEPass.setText("Insira a password");
			}
			else
			{
			try{
				Scanner ler= new Scanner(new File("utilizadores.txt"));
				String[] linha;
				while(ler.hasNextLine()){
					linha = ler.nextLine().split(":");  
					String NomeNoFicheiro=linha[0];
					String PasswordNoFicheiro=linha[1];
					String NomeUtilizadorNoFicheiro=linha[2];
					String Cat=linha[3];
	              
					if(nutil.equals(NomeNoFicheiro)&&ppass.equals(PasswordNoFicheiro))//verifica se o username coicide com a password 
					{
						
							switch (Cat){
								case "D":      //categoria alunos         

// Menus CMenuAlunos=new Menus();
// CMenuAlunos.MenuAluno(NomeUtilizadorNoFicheiro);
System.out.println(“Falta acabar”);
break;

								case "C"://categoria profs
									MenuDocentes MDocen= new MenuDocentes();	
									MDocen.open();
									break;
		                   
								case "B"://categoria profs responsaveis
									MenuDocentesResp MDocenR= new MenuDocentesResp();	
									MDocenR.open();
									this.dispose(); [b]// é esse que está dando erro
									break;
		                  
								case "A"://categoria Funcionarios
									System.out.println("Falta acabar");
									break;
								default:
									System.out.println("Falta acabar");
									break;
		         
							}
						}
						else       
							lblELogin.setText("O utilizador não existe");
					}
		            ler.close(); 
				}  
				catch(FileNotFoundException e1){
					System.out.println(e1.getMessage());
				}         
			}
		}
	});
	
			
	Button btnSair = new Button(shlSge, SWT.NONE);
	btnSair.setBounds(217, 163, 75, 25);
	btnSair.setImage(SWTResourceManager.getImage("Sair.png"));
	btnSair.setText("Sair");
	btnSair.addSelectionListener(new SelectionAdapter() {
		@Override
		public void widgetSelected(SelectionEvent e) {
			System.exit(0);
		}
	});
	
	Label lblLogo = new Label(shlSge, SWT.NONE);
	lblLogo.setAlignment(SWT.CENTER);
	
	lblLogo.setImage(ResourceManager.getImage("Logo100x100.jpg"));
	lblLogo.setBounds(10, 69, 100, 100);
	
	
	
	
}

}[/code]

Faça um teste:

acrescente extends JFrame na declaração da sua classe.

public class MenuLogin extends JFrame {

// resto do codigo

}

Voce pode postar sua classe Shell e a Text ? Analisando melhor seu codigo acho que realmente o erro é outro, não tem nada a ver com o que falei ali em cima, hehehe mania de nao ler tudo logo de cara =D.

public void dispose () { /* * This code is intentionally commented. On some * platforms, the owner window is repainted right * away when a dialog window exits. This behavior * is currently unspecified. */ // /* // * Note: It is valid to attempt to dispose a widget // * more than once. If this happens, fail silently. // */ // if (!isValidWidget ()) return; // if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); // Display oldDisplay = display; super.dispose (); // widget is disposed at this point // if (oldDisplay != null) oldDisplay.update (); }

isso é meu metodo dispose da classe shell

não consigo colocar o código das classes shell e text porque são mto grandes

Ele esta usando SWT… A classe Shell e Text faz parte do SWT!

A principio parece que o problema é por estar fazendo dispose no listener… mas preciso fazer um teste aqui!

Daqui a pouco coloco.

troque:
this.dispose();

por:
shlSge.dispose();

Quem possui o dispose é o Shell…

Dependendo da situação tem que passar a referência do shell para outra janela para controlar.

Assim já não dá erro, mas a janela de login continua aberta por trás na nova janela,

não consigo fazer desaparecer a janela

Estranho… tem certeza que o método dispose esta sendo chamado.
O que pode estar acontecendo é assim. Existe um loop no método open da sua segunda janela, aguardando ela ser fechada para retornar para a primeira janela e poder chamar o dispose.
Algo assim no open da segunda janela:

while (!shell.isDisposed()) {
					if (!display.readAndDispatch()) {
						display.sleep();
					}
				}

Se é isto que esta acontecendo, você precisa fechar a primeira janela, antes de abrir a segunda, invertendo a chamada do dispose com o open.
O ideal é ter um shell principal que fica de fundo e ir passando a referência para as janelas, abrindo estas como filhas do shell principal, que só deverá ser fechado no final do programa.

Ou ainda no caso do login, passar a referência do shell do login, para este shell principal, que ao fazer o login com sucesso, faça o dispose do login e reimplemente o loop principal neste. Implementei algo num app aqui, veja se consegue entender.

public static void carregar(Shell openerShell, IMainMenu interMenu, String versaoSistema) throws CoreException {
		Display display = null;
		MainShellSWT shell = null;
		boolean erroCarregar = false;
		try {
			
			display = Display.getDefault();
			shell = new MainShellSWT(display, interMenu, versaoSistema);
			shell.open();
			shell.layout();
	        			
			openerShell.dispose();
			
		} catch (CoreException cex) {
			cex.printStackTrace();
			throw cex;
		} catch (Exception ex) {
			ex.printStackTrace();
			throw new CoreException("Erro inesperado.", ex);
		} catch (Throwable thr) {
			thr.printStackTrace();
			erroCarregar = true;
		}
		
		if (!erroCarregar) {
			try {
				while (!shell.isDisposed()) {
					if (!display.readAndDispatch()) {
						display.sleep();
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();
				SWTErrorHandler.tratarErro(ex, shell);
			} catch (Throwable thr) {
				thr.printStackTrace();
			} finally {
				finalizarSistema();
			}
		}
		
	}		

O SWT trabalha sempre com um loop que fica aguardando a janela ser fechada… enquanto isso vão ocorrendo os eventos da janela… tudo na mesma thread, pois somente uma thread é responsável pela atualização de tela (tem esquemas para execução assincrona, mas é um pouco complicado, é mais facil executar a lógica do programa em threads separadas, caso isso seja necessário).
Por isso, sempre que ocorre um loop desses o programa fica aguardando a janela fechar, para continuar a execução do que vem abaixo do loop.
Geralmente o método open implementa esse loop quando se usa ferramentas tipo o WindowBuilder para gerar o código.

Veja se consegue resolver…