Graphics2D

Ae, começei a estudar a classe Graphics… e estou vendo como desenha uma imagem no frame, sem o JLabel(Icon). Como faço para chamar o método abaixo? Ou o que eu tenho que mudar???

void desenhar(Graphics g) {
		 Graphics2D g2 = (Graphics2D) g;
		 Image image = new ImageIcon("jog.PNG").getImage();  
		 g2.drawImage(image,100,100, frame); 
	}

abçs

Agora que voce está usando o Graphics2D não use o ImageIcon.

Faça algo asism:

void desenhar(Graphics g) {   
         Graphics2D g2 = (Graphics2D) g.create();
         ImputStream  imgStream = this.class.getResourceAsStream("jog.PNG");
         BufferedImage image = ImageIO.read(imgStream);
         g2.drawImage(image,100,100, frame);   
    } 

O método read da ImageIO aceita um File ou um ImputStream ou uma URL como parametro para carregar a imagem.

Sobrescreva o método paintComponent(Graphics g) do seu componente para fazer o desenho.

public class MeuComponente extends JComponent { public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; InputStream imgStream = getClass().getResourceAsStream("jog.PNG"); BufferedImage image = ImageIO.read(imgStream); g2.drawImage(image, 100, 100, frame); } }
Você pode extender alguma outra coisa se quiser (JLabel por exemplo), desde que essa coisa seja subclasse de JComponent.

Certo, aparentemente deu certo, só que a imagem não aparece, eu tenho que chamar este método de alguma forma??? pois já vi exemplos que não o chama mas ele executa isso que não entendi… ta assim:

public void desenhar(Graphics g) {  
		 try {       
		 Graphics2D g2 = (Graphics2D) g;  
		         File img = new File("jog.png");  
		         BufferedImage image = ImageIO.read(img);   
		         g2.drawImage(image, 50, 100, frame);  
		     }   
		 catch(Exception e) {
			 System.out.println("erro");
		 }
	 }

[quote=malstryx]Certo, aparentemente deu certo, só que a imagem não aparece, eu tenho que chamar este método de alguma forma??? pois já vi exemplos que não o chama mas ele executa isso que não entendi… ta assim:

public void desenhar(Graphics g) { try { Graphics2D g2 = (Graphics2D) g; File img = new File("jog.png"); BufferedImage image = ImageIO.read(img); g2.drawImage(image, 50, 100, frame); } catch(Exception e) { System.out.println("erro"); } } [/quote]

Sobrescreva o método paintComponent. Esse método é chamado pelo AWT para renderizar os componentes.

O método paintComponent é chamado.

E outra coisa sempre que for modificar o Graphics que vem como argumento crie outro para trabalhar como Graphics2D depois libere

public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g.create();//cria
//Trabalha com o g2d (Pinta, coloca imagens, etc..)
g2d.dispose();//libera
}

Fiz o que vocês passaram… pq não está aparecendo a imagem?

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;



public class Teste extends JComponent {
	JFrame frame;
	JPanel panel;
	
	Teste() {
	frame = new JFrame("Game");
	panel = new JPanel();	
	panel.setLayout(null);
	panel.setBackground(Color.WHITE);
	frame.getContentPane().add(panel);
	frame.setVisible(true);
	frame.setSize(800,600);
	frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
	}
	public void paintComponent(Graphics g) {  
     try {
		Graphics2D g2 = (Graphics2D) g;  
      InputStream imgStream = getClass().getResourceAsStream("jog.PNG");  
	   BufferedImage image = ImageIO.read(imgStream);   
	       g2.drawImage(image, 100, 100, panel);  
	     }  
     catch(Exception e) {
    	 System.out.println("Imagem não localizada");
     }
    }

	public static void main(String[] args) {
		new Teste();
		}
	}

[quote=malstryx]Fiz o que vocês passaram… pq não está aparecendo a imagem?

[code]
import java.awt.;
import java.awt.image.
;
import javax.swing.;
import java.io.
;
import javax.imageio.ImageIO;

public class Teste extends JComponent {
JFrame frame;
JPanel panel;

Teste() {
frame = new JFrame("Game");
panel = new JPanel();	
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {  
 try {
	Graphics2D g2 = (Graphics2D) g;  
  InputStream imgStream = getClass().getResourceAsStream("jog.PNG");  
   BufferedImage image = ImageIO.read(imgStream);   
       g2.drawImage(image, 100, 100, panel);  
     }  
 catch(Exception e) {
	 System.out.println("Imagem não localizada");
 }
}

public static void main(String[] args) {
	new Teste();
	}
}

[/code][/quote]

O objeto teste é um componente. Você cria uma JFrame com uma Panel lá. Acontece que o próprio componente que você fez (o Teste) NÃO é acrescentado a tela, e portanto ele não vai ser desenhado lá.

Coloca isso no final do construtor de Teste que resolve:

panel.add(this);
this.setBounds(50, 50, 100, 100);

[quote=victorwss][quote=malstryx]Fiz o que vocês passaram… pq não está aparecendo a imagem?

[code]
import java.awt.;
import java.awt.image.
;
import javax.swing.;
import java.io.
;
import javax.imageio.ImageIO;

public class Teste extends JComponent {
JFrame frame;
JPanel panel;

Teste() {
frame = new JFrame("Game");
panel = new JPanel();	
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setSize(800,600);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {  
 try {
	Graphics2D g2 = (Graphics2D) g;  
  InputStream imgStream = getClass().getResourceAsStream("jog.PNG");  
   BufferedImage image = ImageIO.read(imgStream);   
       g2.drawImage(image, 100, 100, panel);  
     }  
 catch(Exception e) {
	 System.out.println("Imagem não localizada");
 }
}

public static void main(String[] args) {
	new Teste();
	}
}

[/code][/quote]

O objeto teste é um componente. Você cria uma JFrame com uma Panel lá. Acontece que o próprio componente que você fez (o Teste) NÃO é acrescentado a tela, e portanto ele não vai ser desenhado lá.

Coloca isso no final do construtor de Teste que resolve:

panel.add(this); this.setBounds(50, 50, 100, 100); [/quote]

Agora sim :smiley: , vlw mesmo victor.

Ele poderia apenas sobreescrever o paint do JFrame no lugar do paintComponent, não?

Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados!

Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados![/quote]

hum entendi… e se chamasse super(g) no início do método, será que não resolveria?

Poder, até que poderia. Mas haveria efeitos colaterais ruins: Os subcomponentes do JFrame não seriam desenhados![/quote]

hum entendi… e se chamasse super(g) no início do método, será que não resolveria?[/quote]

Isso traria outro efeito colateral. O desenho seria feito por cima dos subcomponentes e da borda do componentes.
Embora por vezes esse efeito colateral seja desejado, na maioria das vezes ele não é.

oi pessoal,

testei os codigos acima, e aqui na minha maquina nao mostrou a imagem…
quem tiver a resposta correta, favor poste ai…

 package testes;
  
   import java.awt.*;  
   import java.awt.image.*;  
   import javax.swing.*;  
   import java.io.*;  
   import javax.imageio.ImageIO;  
      
      
      
    public class imageTeste extends JComponent {  
       JFrame frame;  
       JPanel panel;  
         
      imageTeste() {  
       frame = new JFrame("Game");  
       panel = new JPanel();     
          
       panel.setLayout(null);  
       panel.setBackground(Color.WHITE);  
        // nao funcionou...
           panel.add(this);  
           this.setBounds(50, 50, 100, 100);   
      	
       frame.getContentPane().add(panel);  
       frame.setVisible(true);  
       frame.setSize(800,600);  
       frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);  
       	
       	// tambem nao funcionou
        // this.setBounds(50, 50, 100, 100);  
        //  panel.setBackground(Color.WHITE);  
      	
       }  
       public void paintComponent(Graphics g) {    
        try {  
         Graphics2D g2 = (Graphics2D) g;    
         InputStream imgStream = getClass().getResourceAsStream("imagens/teste.png");    
          BufferedImage image = ImageIO.read(imgStream);     
            g2.drawImage(image, 100, 100, panel); 
            	System.out.println("Mostrando imagem");   
            }    
        catch(Exception e) {  
           System.out.println("Imagem não localizada");  
       }  
     }  
     
       public static void main(String[] args) {  
          new imageTeste();  
          }  
      }