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:
-
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.
-
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.
-
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