[swt] SelectionListener

5 respostas
_fs

Olá, boa tarde.

Seguinte situação: tenho uma tabela com algumas colunas e itens, e nela adiciono o seguinte código

table = new Table( shell, SWT.FULL_SELECTION | SWT.BORDER );
		table.setLayoutData( new GridData( GridData.FILL_BOTH ) );
		table.setHeaderVisible( true );
		
		table.addSelectionListener(new SelectionAdapter()
		{
			public void widgetSelected( SelectionEvent e )
			{
					tCliente.setText( "teste tCliente.setText" );
			}
		} );
	}

Bem simples. Meu tCliente é igual a “”. Crio as colunas e itens em outros métodos.

O programa é executado normalmente, mas quando clico num item da tabela a seguinte exeção ocorre:

java.lang.NullPointerException
	at Agenda.Agenda$1.widgetSelected(Agenda.java:215)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:89)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:81)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:840)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1838)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1545)
	at Agenda.Agenda.main(Agenda.java:62)
Exception in thread "main"

E esse Agenda.java:62 aponta para o IF no seguinte trecho:

while( !shell.isDisposed() ) //loop ate shell ser fechada
		{
			if( !display.readAndDispatch() )
			{
				display.sleep();
			}
		}

Alguém pode me ajudar?

Valeu!

5 Respostas

_fs

Entendi o problema: não consigo fazer um getText ou setText nos meus textFields pois, mesmo com o programa rodando e com os campos sendo static, eles não tem valor definido :frowning:

Preciso descobrir agora o porquê

Umlauf

LIPE, a linha que tá dando pau é a Agenda.Agenda$1.widgetSelected(Agenda.java:215) :slight_smile:

Não entendi o que é esse tCliente, mas tenta assim:

table.addSelectionListener(new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { // Pega a linha selecionada TableItem item = (TableItem)e.item; if (item == null) return; // TableItem.setText([<coluna>,] <texto>) item.setText(0, "teste tCliente.setText"); } } );

_fs

Desculpe, não expressei bem: o tCliente é um TextField criado anteriormente.

O problema, pelo que percebi agora, é outro: os meus TextFields continuam com valor null, apesar de te-lôs setados como “” ao executar o programa; portanto não consigo ter acesso ao valor deles.

Mas muito obrigado pela dica cara :smiley:

_fs

Nossa pelo que estou entendendo o problem é bem mais difícil de resolver do que imaginei.

Vou postar parte do código:

public static void main( String args[] )
	{
		Display display = new Display();
		Agenda agenda = new Agenda();
		
		Shell shell = agenda.open( display );
				
		while( !shell.isDisposed() )
		{
			if( !display.readAndDispatch() )
			{
				display.sleep();
			}
		}
		
		display.dispose();
		System.exit( 0 );
	}
	
	public Agenda()
	{
		super();
	}
	
	public Shell open( Display display )
	{
		Shell shell = new Shell( display );
		shell.setText( "Agenda" );
		
		GridLayout gridLayout = new GridLayout();
		gridLayout.marginHeight = 10;
		gridLayout.marginWidth = 10;
		
		shell.setLayout( gridLayout );
		
		Filtros( shell );

		createTable( shell );
		Form( shell );
		
		System.out.println( tCliente.getText() );
				
		shell.pack();
		shell.setSize( 760,550 );
		centerOnScreen( display, shell );
		shell.open();
		
		return shell;
	}

Como podem perceber, não estou instanciando tudo dentro do main, mas sim em métodos separados.

O erro ocorre no final do método open, quando tento tento tCliente.getText().

tCliente é um static Text e, nos métodos que eu chamo antes de executar a linha onde ocorre o erro, eu o instancio e seto seu valor para “”.

Mas mesmo assim o seguinte erro ocorre:

java.lang.NullPointerException
	at Agenda.Agenda.open(Agenda.java:96)
	at Agenda.Agenda.main(Agenda.java:61)
Exception in thread "main"

Exatamente onde reside o System.out.println( tCliente.getText() );

Isso ajuda?

Valeu!

_fs

Achei o erro, mas não entendi.

Deixe-me explicar:
No método open acima eu chamava o método Form() e este, entre outras coisas, chamava o método createText() alguma vezes.

Se ao invés de usar o método createText() eu instanciar o TextFields no próprio método Form() o programa funciona e eu consigo ter acesso ao valor dos TextFields … bizarro.

Criado 1 de dezembro de 2003
Ultima resposta 1 de dez. de 2003
Respostas 5
Participantes 2