Desenhar em Swing

11 respostas
paulojribp

Caros, bom dia…

Minha dúvida é bem simples e creio que muitos de vocês já passaram por isso.
Gostaria de saber qual é o melhor componente swing para se desenhar. O label é o ideal? Qual tem melhor performance?

Valeu,

11 Respostas

E

Que mania do pessoal perguntar logo de cara “qual tem a melhor performance”. Primeiro é necessário resolver o problema, e se o desempenho estiver insatisfatório, você pergunta sobre alguma alternativa que não envolva mudar demais seu programa.

Você está perguntando “qual é o melhor para desenhar”. Por desenhar você quer dizer o quê?

a) Você quer mostrar algumas figuras geométricas em um determinado local da tela.
b) Você quer mostrar uma figura pronta, carregada a partir de um arquivo do disco, em formato PNG ou JPEG.
c) Você quer criar um mini-editor como o MS-Paint.
d) Você quer criar um mini-editor como o MS-Visio.

Cada coisa requer classes diferentes. O JLabel serve para o caso b), mas se você precisa customizar alguma coisa no caso b) (por exemplo, desenhar um texto sobre a figura) você já precisa usar ainda outra coisa.

R

kra, não sei se entendi direito mas acho q ele quer algum plugin no estilo do VE (visual editor), onde terá uma paleta com os itens, o que facilitará no desenvolvimento das telas. Me corrija se eu tiver errado.

Abçs

ViniGodoy

E ainda tem a alternativa

e) Você quer fazer vídeo, animações ou jogos.

paulojribp

Realmente fui muito sucinto na minha pergunta. Desculpe…

  1. Melhor performance pois se jLabel não tem bom desempenho (já conhecido por todos) na hora de desenhar, então nem perco meu tempo usando ele.

  2. É para desenhar “na mão” dentro do componente, seja jLabel, ImageIcon, etc… não vou fazer nenhum mini-editor nem nada… mas é para desenhar um joguinho dentro desse componente.
    Eu uso atualmente jLabel com ImageIcon, mas me parece muito extranho usar um label para desenhar as coisas…

Alguma sugestão?
Valeu…

E

Você quer fazer um joguinho?

Aí está o ViniGodoy que é especialista nisso. Ele pode lhe explicar melhor como fazer seu joguinho funcionar bem rápido.

fabiofalci

http://java.sun.com/products/jfc/tsc/articles/swing2d/

rod

Faz um bom tempo que fiz esse exemplo de como desenhar um olho em um applet, espero que esse artigo possa te ajudar.

ViniGodoy

Que tipo de jogo é?

Se o joguinho for desktop, ou mesmo num JApplet, você não deve coloca-lo dentro de nenhum componente.
Faça a sobrecarga diretamente no JFrame. É uma boa seguir esse tutorial aqui:
http://www.cokeandcode.com/node/6

E ler os primeiros capítulos desse e-book (em especial, a parte sobre o loop de animação):
http://fivedots.coe.psu.ac.th/~ad/jg/

Se for fazer realmente para colocar num componente, então, faça um filho direto de JComponent. O seu componente será o próprio jogo.

A performance de qualquer componente é igual, o que muda é como você organiza o seu método de pintura. Não faz diferença sobrescrever JPanel, JLabel ou JComponent. Só aconselho o JComponent para você não ter uma classe cheia de métodos que no fundo não serão usados.

É uma boa usar o JComponent para criar editores de fases, ou classes visuais de suporte desse gênero.

ViniGodoy

Legal, mas seu código tem um erro básico, de quem está começando a desenhar em AWT/Swing. Existe uma regra de ouro que diz:
Você não deve alterar o estado do objeto Graphics recebido como parâmetro.

Por exemplo, se você receber um Graphics e quiser usar um setColor, terá que salvar antes o status desse setColor(), para depois restaura-lo. Isso vale para qualquer coisa que altere o estado do Graphics.

Felizmente, os projetistas do Graphics já pensaram nisso. É possível gerar uma cópia do contexto gráfico antes de iniciar a pintura. Assim, você altera a vontade o estado da cópia e, no final, a descarta, deixando o Graphics original intacto.

Para aplicar essa correção no seu código, simplesmente faça:

public void paint(Graphics g) { Graphics g2 = g.create(); this.desenhaBorda(g2); this.desenhaOlho(g2); this.desenhaTexto(g2); g2.dispose(); }

sergiotaborda

paulojribp:
Caros, bom dia…

Minha dúvida é bem simples e creio que muitos de vocês já passaram por isso.
Gostaria de saber qual é o melhor componente swing para se desenhar. O label é o ideal? Qual tem melhor performance?

Depende :slight_smile:

Para desenhar o quê ?
Se vc quer fazer um componente isolado, por exemplo, para mostrar gráficos onde ele faz 100 do desenho, então comece com JComponent (pois é, vc extend JComponent diretamente)

Se vc quer desenhar , mas tb quer colocar objetos (como num desenho uml, por exemplo) entao um JPanel seria melhor.
Não existe um JCanvas porque o swing já é “canvas” por natureza.

Outro detalhe, vc desenha com Java2D e não com swing. Isso é util para pesquisar no google.

Se vc quer desenhar no sentido de “tenho o componente de texto mas quero que fique com bordas redondas” vc precisa criar um Look and Feel (que é dificil) ou utilizar um L&F costumizável como o substance.

paulojribp

Caras, valeu mesmo… era isso…

ViniGodoy, valeu ai por todas as dicas… boas práticas são essenciais para esse tipo de trabalho.

Vou desenrolando aqui e depois mando o resultado.
Abraços…

Criado 22 de outubro de 2009
Ultima resposta 22 de out. de 2009
Respostas 11
Participantes 7