Colocar Canvas dentro de um JPanel [RESOLVIDO]

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!

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

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?

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.

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!

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

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.