Colocar Canvas dentro de um JPanel [RESOLVIDO]

5 respostas
gqferreira

Boa noite galera! :wink:

Alguém ja fez alguma “firula” usando canvas e depois colocou em um JPanel?

Fiz um relogio digital com aparencia de display de calculadora usando canvas. Agora preciso colocar em um JPanel, ja rodei a net toda e nada… so consigo colocar dentro de um JFrame ou JDialog, containers do tipo janela, mas preciso colocar dentro de um jpanel.

Alguém? :lol:

Vlw gente!

5 Respostas

ViniGodoy

Você não deve misturar AWT e Swing. Sobrescreva o método paintComponent do JPanel, ou do JComponent, e transfira o código do relógio para lá.

gqferreira

Ow… vlw vini, como sempre, vc me ajudando… ^^
Aproveitando o embalo, porque nao se deve misturar awt com swing? Apenas pela organizacao no quesito “ser puramente uma api só” ou algo relacionado a performace?

ViniGodoy

Não, o problema é mais embaixo. Está relacionado a forma que os componentes trabalham.

A AWT tenta fazer janelas usando recursos do SO. Quando você desenha um botão, a AWT usa a API do Windows para desenhar um botão. O mesmo vale para qualquer outro componente. Isso é chamado de componente “heavy weight” (pesado).

O Swing não trabalha assim. Ele cria um único canvas, acelerado por hardware, e após isso, faz ele mesmo o desenho usando java 2D. Esse desenho é feito usando alguma biblioteca de pintura acelerada, como OpenGL ou, no caso do Windows, DirectX. No Swing, quando um botão é desenhado, ele é efetivamente pintado sobre o painel, não há a criação de componentes do Windows adicionais. Por isso, ele também consome menos recursos do SO, e é chamado de “light weight” (leve).

Quando vc mistura as duas coisas ocorrem alguns efeitos indesejados:

  1. Todos os componentes da AWT ficam SOBRE os componentes do Swing. Isso pq o botão é um componente da GDI, que está sobre o canvas, e os componentes do Swing são a “pintura” desse mesmo canvas;
  2. Eventos podem se perder. A captura dos eventos dos componentes da AWT não é propagada para os componentes Swing;
  3. Não é possível usar componentes como o JScrollPane sobre componentes da AWT.
  4. Layout managers também não funcionam como deveriam.

Esse artigo explica em detalhes essas situações: http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/lightweights.html

Para pintar no Swing, substitua a classe Canvas pela classe JComponent. Se precisar de um componente que suporte outros em cima dele, faça um filho de JPanel. E lembre-se que no caso do Swing o método que deve ser sobrescrito para pintura é o paintComponent, não o método paint.

gqferreira

Bacana vini… entendi bem e ja consegui fazer meus “brinquedinhos” em canvas funcionarem… ^^
A proposito, vc lessiona? Sabe explicar com tanta clareza…

Vlw vini, um abraco!

ViniGodoy

gqferreira:
Bacana vini… entendi bem e ja consegui fazer meus “brinquedinhos” em canvas funcionarem… ^^
A proposito, vc lessiona? Sabe explicar com tanta clareza…

Sim, sou professor da pós-graduação em jogos digitais da PUC/PR.
E do curso de Superior de Tecnologia em Jogos da PUC também.

Mas em nenhum deles dou aula de Java.

Criado 27 de junho de 2010
Ultima resposta 28 de jun. de 2010
Respostas 5
Participantes 2