JPanel Paint nao funciona como eu queria

Oi gente, estou com um problema com um JPanel…

Tenho uma serie de objetos a serem desenhados e coloquei o codigo para fazer isso no paintComponent desse JPanel.

Acontece que quando o objeto é desenhado pela primeira vez funciona. Ao arrastar a janela funciona. Ao dar ALT-TAB e voltar nao funciona.

Ao dar ALT-TAB o método paintComponent é chamado, os objetos são desenhados mas a tela fica vazia… alguma sugestao?

Parte do codigo segue…

Guilherme Silveira

[code]public class TabletCanvas extends JPanel {

private TabletClient client;

public TabletCanvas(TabletClient client) {
    this.client = client;
}

protected List shapes = new ArrayList();

public void paintComponent(Graphics g) {
    Dimension dim = getSize();
    g.setColor(Color.white);
    g.fillRect(0, 0, dim.width, dim.height);
    g.setColor(Color.black);
    System.out.println("painting " + this.shapes.size() + " shapes");
    if (this.shapes != null) {
        Iterator iter = this.shapes.iterator();
        while (iter.hasNext()) {
            Tool shape = (Tool) iter.next();
            if (shape != null) {
                shape.draw(this);
            }
        }
    }
}

}[/code]

não seria pq qnd vc arrasta ele executa método repaint() ???

e qdo eu dou ALT+TAB ele nao chama o repaint? o q ele chama qdo eu dou ALT+TAB?

e como fazer para repintar quando ele voltar com o ALT+TAB?

vou tentar colocar um window listener com onFocus = repaint… sera isso?

faz algum tempo q não mexo com swing, mas ACHO q o paintComponent é executado uma vez e depois ele só chama o repaint() qnd for necessário redesenhar a janela…

não encare como verdade absoluta pois como faz algum tempo q não brinco com swing, posso estar enganado… :lol:

Cara, não é isso…

pq vc não adiciona os seus shapes como componentes filhos?

Tem umas propriedades do JPanel que vc tem que prestar atenção:

  1. size(Dimension): um repaint() só atualiza a área visível do componente. Mas da primeira vez, ele pinta de qq jeito. Se vc desenhou pra fora do tamando do componente da primeira vez, ele pinta, e vc vê o resultado.

  2. opaque(boolean) dos filhos: a área visível é o tamanho do componente menos tudo o que está em cima dele e é opaco. Se vc tem filhos opacos, o Swing só desenha os filhos, e pode estar pulando o seu JPanel.

  3. tamanho do pai: muitos componentes têm um viewport separado do size, é o caso do JScrollPane por exemplo, a AWT só redesenha o pedaço que está visível. Dependendo do layout que o pai do seu JPanel tem, vc pode não estar recebendo a área inteira.

Outra coisa que vc pode fazer é não pintar o fundo na mão, setar o background pra uma cor nada a ver (eu gosto de Color.CYAN e Color.YELLOW) quando constrói o JPanel e chamar super.paintComponent(g). Assim vc vê o que é que ele tá pintando de verdade…

[]s

Vc já tentou colocar o seu código dentro do método paint ao invés do paintComponent? Eu já fiz isso algumas vezes e funcionou direito.

Espero ter ajudado … caso já não de certo me avise para eu ficar sabendo!

[]s