JPanel Paint nao funciona como eu queria

5 respostas
Guilherme_Silveira

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

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

}

5 Respostas

cariocathi

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

Guilherme_Silveira

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?

cariocathi

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:

dukejeffrie

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

D

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

Criado 8 de maio de 2004
Ultima resposta 17 de mai. de 2004
Respostas 5
Participantes 4