Ajuda com Java2d

13 respostas
davi1993

galera, estou querendo criar um joguinho em java2d, na verdade, simular akele Snake dos celulares nokias.
o problema é que nao manjo nadaaa de java2d, estou ate com um livro aqui… mas o exemplos que ele dá, separa as classes( o que é bom, mas por questao de aprendizado gostaria de fazer tudo em uma )

vou tentar explicar o que o livro faz, e o que eu gostaria de fazer

->livro

-------public class Teste2d extends JPanel(contem o metodo paintComponent(Graphics g))

-------public static void main Teste2d t = new Teste2d; frame.add(Teste2d);

ou seja, ele add no jframe a classe Teste2d que nada mais eh que um JPanel.

como eu faria pra add um objeto 2d ao jframe, sem ter que criar outra classe e nela, herdar um JPanel?
se alguem tiver um exemplo bem simples, de um quadrado que for, ajudaria muito!

vlw

13 Respostas

tpmarc

Desenvolvi um jogo totalmente em Java 2d e sem nenhum framework em um projeto de uma cadeira do curso. Aprendi muito no site do VinyGodoy, o PontoV. Recomendo muito que siga a trilha de lá.

http://www.pontov.com.br/site/

tpmarc

sobre o que vc quer...

no seu metodo paint:
public void paint(Graphics g) {
   
    Graphics2D g2d = (Graphics2D) g;
    g2d.drawRectangle(x, y, largura, altura);

}
mdea

Poderia passar o nome do livro?

Tambem recomento o http://www.pontov.com.br

davi1993

O livro é do deitel: Java Como programar

interessante, vou dar uma olhada no site! vlw

sobre o metodo paint acima…
pra mim exibi-lo num jframe porexemplo
como eu faria?

jframe.add(paint());?

nao estou conseguindo exibir o graphics2d sem criar uma classe nova e herdar um JPanel

mdea

Você pode sobrescrever o método paint() em um JPanel e adicionar o painel em um JFrame

davi1993

essa seria a unica forma de mecher com java2d? pq pra sobrescrever seria necessario herdar, e para herdar eu teria que criar uma classe nova… our herdar na mesma correto?
no caso toda vez que utilizar java2d teria que criar uma classe nova para herdar um JPanel e sobrescrever o metodo paint()?

vlw!!

mdea

Eu sinceramente não sei se existe alguma outra forma. Mas entendo as suas questões, vamos ver se aparece alguém que conheça alguma outra forma.

tpmarc

Realmente acredito que seja necessário ter um JPanel para desenhar 2d.

E

Olha, no meu projeto(universo pessoal, na minha assinatura), eu uso uma técnica pouco conhecida e um tanto arriscada, que é a composição misturada com herança inline. Ela funciona, mas deixa o código um pouco confuso.

O ponto forte é que você pode separar os listener’s do Jpanel, algo que geralmente fica junto e que me incomada bastante. Eu to sem o código aqui, mas se tu quiseres eu faço um exemplo.

Outra dica é o usar os tutorias oficiais da sun(eles herdam Jpanel lá):
http://download.oracle.com/javase/tutorial/uiswing/painting/index.html

Melhor material que eu já encontrei na internet.

davi1993

elissonandrade:
Olha, no meu projeto(universo pessoal, na minha assinatura), eu uso uma técnica pouco conhecida e um tanto arriscada, que é a composição misturada com herança inline. Ela funciona, mas deixa o código um pouco confuso.

O ponto forte é que você pode separar os listener’s do Jpanel, algo que geralmente fica junto e que me incomada bastante. Eu to sem o código aqui, mas se tu quiseres eu faço um exemplo.

Outra dica é o usar os tutorias oficiais da sun(eles herdam Jpanel lá):
http://download.oracle.com/javase/tutorial/uiswing/painting/index.html

Melhor material que eu já encontrei na internet.

muito interessante essa de herança inline.
poderia deixar um exemplo pra nós?

tbm nao me agrada muito deixar os listeners junto :smiley:

E

Funciona mais ou menos assim: primeiro, o argumento onde você cria o JPanel, você faz assim ó:

//digamos que é um atributo da classe
JPanel areaDesenho = new JPanel(){
protected paintComponent(Graphics g){
super(g);
//reescreve o método aqui, desenhando o que você quer sem criar outra classe só pra herdar o JPanel :)
};

A grande complicação que eu tive em fazer um código assim é que o uso da palavra chave this se torna um pouco ambíguo pro programador.

davi1993

pocha, muito interessante, com alguns ajuste deu certo! vlww mesmo pela ajuda brow!!
nao sabia que dava pra instanciar classe assim, reescrevendo o metodo sem ter que herdar :smiley:
vlw mesmo!

pra quem tiver a mesma duvida, ai esta

JPanel desenho = new JPanel(){
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawString("omg cant believe in it!",10,20);
            }
        };
        qualquerFrame.add(desenho);
E
pocha, muito interessante, com alguns ajuste deu certo! vlww mesmo pela ajuda brow!! nao sabia que dava pra instanciar classe assim, reescrevendo o metodo sem ter que herdar vlw mesmo!

Quando eu comecei o projeto da assinatura(UniversoPessoal), esse problema de ter que herdar me desanimou logo de cara. Mas, num livro aí eu vi essa técnica implícita. Ela também é ideal para criar Action listeners sem ter que crias várias classes muitas vezes pra serem usadas só uma vez. É impressionante o numero de coisas que existem em java que nem as apostilas ou os cursos mencionam.

Uma última recomendação é que você não use o objeto g diretamente, mas mande-o para um método externo, tipo:
//digamos que é um atributo da classe  
 JPanel areaDesenho = new JPanel(){  
 protected paintComponent(Graphics g){  
super.paintComponent(g); 
fazDesenhos(g);//isso nunca vai ser alterado!
 };

void fazDesenhos(Graphics g){
g.drawString("omg cant believe in it!",10,20); 
//modifique como quiser essa parte
}

Assim, fica mais limpo e mais fácil de se fazer manutenção!!

Criado 4 de fevereiro de 2011
Ultima resposta 9 de fev. de 2011
Respostas 13
Participantes 4