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);