Acabar com o listener?

Hey,
tenho duas combobox com um ActionListener cada uma.

O problema é que quando o utilizador quiser Voltar para o frame anterior eu mando apagar tudo o que esteja nessas comboboxs (porque elas sao construidas dependendo do que é feito no frame anterior)
Ora bem, dá erro… pelo que sei o ActionListener nao gosta que elas estejam vazias… Como poderei evitar isto

Combo1.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { MostrarTurmas(); } }); Combo2.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { MostrarTurmas(); } });

Ainda por cima fazem o mesmo, ainda nao percebi como nao repetir :x

E principalmente nao consigo descobrir como usar o removeActionListener…

Oi amigo

Para não repetir, é só fazer uma classe interna separada pra ActionListener do combobox:

public class MinhaClasse {
	
	JComboBox combo1 = new JComboBox();
	JComboBox combo2 = new JComboBox();
	
	//seu programa normal.. blablabla
	
	public MinhaClasse() {
		//pronto.. não repete mais ;)
		combo1.addActionListener( new TrataCombos() );
		combo2.addActionListener( new TrataCombos() );
	}
	
	//seu método MostrarTurmas que deve estar por aqui
	private void MostrarTurmas() {
		//blablabla
	}

	//classe interna que vai tratar os combos
	class TrataCombos implements ActionListener {
		public void actionPerformed(ActionEvent e) {     
			MostrarTurmas();   
		}    
	}
	
}

outra coisinha… esses problemas de dar erro quando apaga… pra mecher legal com Swing, é preciso saber alguns conceitos… certifique-se de algumas coisas:

1 - Leia um pouco sobre a “thread de dispacho de eventos”… tudo que altera um componente swing que não esteja dentro de um evento, precisa ser feito dentro do maldito “invokeLater”.
2 - Se o que voce faz no evento for muito demorado, por favor use um “SwingWorker” (leia um pouco sobre isso também).
3 - Depois de alterar um “DefaultListModel” ou uma “List” que alimenta o componente, chame o “repaint” do mesmo, pra se certificar que vai atualizar a GUI.
4 - Tente apagar com o “clear”.
5 - Se o erro persistir, ao inves de apagar, sete a antiga como null e tente criando uma nova lista em branco “new List()”.
6 - Se ainda persistir… ai fudeu… huauhaha… faz a gambiarra do try-catch vazio … huauahahuha
ja tive q fazer isso uma vez, e pior q deu certo… rsrs

Abraço brow

Muito obrigado pela sua ajuda =D
Realmente assim dessa maneira escuso de repetir a instrução

Agora quanto ao apagar, realmente está mais complicado -_-’

Qual a diferença do model a null ou a branco? =P

Se eu tiver

TrataCombos x=new TrataCombos(); Combo1.addActionListener(x); Combo2.addActionListener(x);

não poderia depois fazer

?

Confesso-me muito verde neste assunto =/
Comecei a perceber java e as suas utilidades há 3 meses e espero conseguir aprender ainda mais

Mas eu não entendi o porque você quer retirar os listeners!!

Outra coisinha… cuidado com o seguinte:

TrataCombos x=new TrataCombos();   
Combo1.addActionListener(x);   
Combo2.addActionListener(x); 

é muito diferente de:

Combo1.addActionListener( new TrataCombos() );   
Combo2.addActionListener( new TrataCombos() ); 

No primeiro exemplo, você tem um mesmo objeto para tratar os dois eventos. No segundo, são dois objetos diferentes, um pra cada evento. Se o seu objeto TrataCombos guardar algum estado, com variáveis de instância por exemplo, um evento vai influenciar no outro. No segundo eles são dois objetos distintos, independentes.

Quanto a sua ultima pergunta, poderia sim fazer! E é assim mesmo que se faz… o que deve estar errado é o escopo dessa sua referência “x”. Ela tem que estar dentro do escopo atual e estar apontando pro objeto que foi registrado como listener. Talvez você possa estar perdendo o escopo dela quando a chama em outra parte do código.

Se você tiver perdido a referência, pode fazer assim:

for ( ActionListener aux: combo1.getActionListeners() ) {
  combo1.removeActionListener(aux);
}

xi, nem diga nada, claro que nao podia resultar
O “x” estava numa funçao private, claro que depois nao o podia chamar na outra =/
Que falha, nem eu me considero tão novato =P

Corrigi e pensei que iria resultar. Mas continua. Vou tentar explicar melhor o meu problema, e muito obrigado por toda a ajuda prestada

Tenho dois frames. Um botao de VOLTAR e SEGUINTE em cada
Quando estou no primeiro frame tenho uma lista, e quando carrego SEGUINTE ele carrega as coisas da lista para uma combobox do segundo frame. Resumindo, a combobox no segundo frame depende do primeiro. Por isso quando eu volto do segundo frame para o primeiro mando apagar o conteudo dessa combobox ( modelobox.removeAllElements(); )

O problema é que quando eu mando apagar ele deve considerar isso como evento e chama a função MostrarTurmas()
E a função MostrarTurmas() tem uma instrução que é:

(Eu tenho-lhe chamado Combo1 mas na verdade é ComboCadeira)

E dá erro… claro… Combo1 está vazia por isso nao pode haver um getSelectedItem()…

Eu no botao VOLTAR do segundo frame tenho:

jFrameTurmas.setVisible(false); ComboTipoTurma.removeActionListener(x); modelobox.removeAllElements(); modelotipoturma.removeAllElements(); jFrameCadeiras.setVisible(true);

Removi o listener antes, devia resultar nao? =/

tenta o seguinte… ao inves de apagar o model com o removeAllElements, tenta criar um novo model e setar dentro do combo… por exemplo

modelobox = new DeafultListModel(); //aqui você terá um modelo vazio
combo1.setModel(modelobox); //coloca esse novo modelo vazio no combo

Excelente =D

Já vimos então que há diferença mas por curiosidade (ou perceber melhor, porque eu também gosto de perceber :P) qual a diferença no model em:

model = new DefaultComboBoxModel(); Combo1.setModel(model);

model.removeAllElements(); Combo1.setModel(model);