Re:JComboBox.repaint()

7 respostas
Sami_Koivu

Olá,

Caso você criou o JComboBox com um Vector, adicionar elementos no Vector não resulta em elementos adicionados no combo. Ele só lê o Vector no construtor. Não consegui determinar se seria este seu problema, ou se o problema realmente está na apresentação.

Pessoalmente eu tenho explicitamente definido um DefaultComboBoxModel para acessar o conteúdo do combo e aí chamando o método addElement(String) desse modelo.

Por exemplo:

DefaultComboBoxModel model = new DefaultComboBoxModel();
    JComboBox combo = new JComboBox(model);
...
    model.addElement("novo elemento");

[]s,
Sami

7 Respostas

J

Eu não me lembro direito, mas você pega o teu objeto box( Isso depois de tu inserir, se tiver em outra tela, tu vai ter que criar uma instância da classe onde o combo está! ), e alguma coisa com box.clearAll( Só sei que é pra limpar tudo do box! hehe ) e logo depois chame o seu código que popula o seu combo!!

  • Recapitulando:
    Após o código de inserção( se for um método de inserção, dentro desse método ), limpe o box e depois chame o código que pega os dados do banco e popula o box!
    Valeu!!!
Sami_Koivu

Isso não funciona, porque o que está visível na sua tela é o objeto JComboBox que foi adicionado no seu JDialog. Setando o valor do variavel para um novo objeto JComboBox não afeta o que está visível na tela. A tela (ou um painel contido nela) ainda está referindo ao objeto original.

Vê se esses exemplos te ajudam para conseguir o que você quer.

Exemplo 1:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboTeste extends JFrame {
     
    int value = 3;

    DefaultComboBoxModel model = new DefaultComboBoxModel(getArray());
    JComboBox combo = new JComboBox(this.model);
    JButton button = new JButton("Adicionar");
    
    
    public ComboTeste() {
        super("Teste");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new FlowLayout());
        this.getContentPane().add(this.combo);
        this.getContentPane().add(this.button);
        this.button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                model.removeAllElements();
                Object[] array = getArray();
                for (int i=0; i < array.length; i++) {
                    model.addElement(array[i]);
                }
            }
     
        });
        
        pack();
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new ComboTeste();
    }
    
    public Object[] getArray() {
        Object[] array = new Object[this.value++];
        for (int i=0; i < array.length; i++) {
            array[i] = "teste " + (i + 1);
        }
        
        return array;
    }
}

Exemplo 2:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboTeste extends JFrame {
     
    int value = 3;

    JComboBox combo = new JComboBox(new DefaultComboBoxModel(getArray()));
    JButton button = new JButton("Adicionar");
    
    
    public ComboTeste() {
        super("Teste");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new FlowLayout());
        this.getContentPane().add(this.combo);
        this.getContentPane().add(this.button);
        this.button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                combo.setModel(new DefaultComboBoxModel(getArray()));
            }
     
        });
        
        pack();
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new ComboTeste();
    }
    
    public Object[] getArray() {
        Object[] array = new Object[this.value++];
        for (int i=0; i < array.length; i++) {
            array[i] = "teste " + (i + 1);
        }
        
        return array;
    }
}

[]s,
Sami

Sami_Koivu

Olá,

Por exemplo criando um método publico no seu frame que atualiza o combo. E aí, passando uma referência desse frame ao outro frame. Como tem mil jeitos de conseguir isso, não posso dizer qual seria o mais apropriado para sua aplicação, mas por exemplo assim:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboTeste extends JFrame {
     
    JComboBox combo = new JComboBox(new DefaultComboBoxModel());
    
    public ComboTeste() {
        super("Combo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new FlowLayout());
        this.getContentPane().add(this.combo);
        
        pack();
        setVisible(true);
    }
    
    public void atualizarCombo(Object[] array) {
        this.combo.setModel(new DefaultComboBoxModel(array));
    }
    
    public static void main(String[] args) {
        ComboTeste comboTeste = new ComboTeste();
        new ComboAdder(comboTeste);
    }
    
}

class ComboAdder extends JFrame {
    JButton button = new JButton("Adicionar");
    int value = 1;

    public ComboAdder(final ComboTeste comboTeste) {
        super("Adicionar");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new FlowLayout());
        this.getContentPane().add(this.button);
        this.button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                comboTeste.atualizarCombo(getArray());
            }
     
        });
        
        pack();
        setVisible(true);
    }

    public Object[] getArray() {
        Object[] array = new Object[this.value++];
        for (int i=0; i &lt; array.length; i++) {
            array[i] = "teste " + (i + 1);
        }
        
        return array;
    }
}
Spool

Pessoal, estou com uma duvida um pouco boba, mas nao achei solução para isso.

Seguinte, tenho um JDialog que tem um JComboBox que lista os nomes de Empresas.
Em frente esse Combo, tenho um JButton chamado INCLUIR para chamar um outro JDialog de cadastro de Empresas, para o caso de não existir a lista.

Ate aqui tudo bem.

Minha duvida esta na hora de atualizar o JComboBox do primeiro JDialog quando eu fecho o formulario de cadastro ( no caso o 2º JDialog ).

Como poderia fazer para atualizar os dados do JComboBox, afim de mostrar na lista a nova empresa cadastrada ?

Ja tentei repaint(), SwingUtilities, etc etc etc

Nada q eu fiz retornou o resultado esperado…

Valew!

Abraços!

Spool

Jhonatas:
Eu não me lembro direito, mas você pega o teu objeto box( Isso depois de tu inserir, se tiver em outra tela, tu vai ter que criar uma instância da classe onde o combo está! ), e alguma coisa com box.clearAll( Só sei que é pra limpar tudo do box! hehe ) e logo depois chame o seu código que popula o seu combo!!

  • Recapitulando:
    Após o código de inserção( se for um método de inserção, dentro desse método ), limpe o box e depois chame o código que pega os dados do banco e popula o box!
    Valeu!!!

Então… Eu populo o combo na inicialização dele, solicitando uma Array de uma outra classe. Ex:

JComboBox combo = new JComboBox( new AlgumaClasse().getArray() );

Como poderia fazer para colocar o conteudo do metodo atualizado novamente no combo?

Ja tentei setar a variavel como null depois inicializa-la novamente mais tb nao deu certo…

Abraços.

Spool
<blockquote><div class="quote-author">Sami Koivu:</div>             public void actionPerformed(ActionEvent arg0) {

combo.setModel(new DefaultComboBoxModel(getArray()));

}

</blockquote>

Então… Se for pra atualizar o componente no mesmo frame eu entendi. Mas como eu faço pra atualizar esse componente de outro frame?

Spool

Só pra finalizar o tópico então:
Ficou resolvido dessa forma:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ComboTeste extends JFrame {

	private JComboBox combo;
	private DefaultComboBoxModel model;

	public ComboTeste() {

		setTitle("JComboBox Sample");
		setSize(300, 60);
		setResizable(false);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		model = new DefaultComboBoxModel();
		combo = new JComboBox(model);

		this.getContentPane().add(BorderLayout.CENTER, combo);

		new ComboTeste2(this).setVisible(true);
	}

	public void updateCombo(Object[] array) {
		this.combo.setModel(new DefaultComboBoxModel(array));
	}

	public static void main(String[] args) {
		new ComboTeste().setVisible(true);
	}

}

class ComboTeste2 extends JFrame {

	private JButton button;
	private int value = 1;

	public ComboTeste2(final ComboTeste comboTeste) {

		setTitle("JComboBox Sample2");
		setSize(150, 60);
		setResizable(false);
		setLocation(100, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		button = new JButton("Adicionar");
		this.getContentPane().add(BorderLayout.CENTER, button);
		this.button.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					comboTeste.updateCombo(getArray());
				}
			}
		);


	}

     private Object[] getArray() {
         Object[] array = new Object[this.value++];
         for (int i=0; i < array.length; i++) {
             array[i] = "Valor " + (i + 1);
         }

         return array;
     }


}

Abraços a todos. E obrigado a todos que postaram!

Criado 31 de maio de 2006
Ultima resposta 4 de jun. de 2006
Respostas 7
Participantes 3