Graphics2D

13 respostas
M

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

13 Respostas

Marky.Vasconcelos

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.

victorwss

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.

M

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");
		 }
	 }
victorwss

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"); } }

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

Marky.Vasconcelos

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
}
M

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();
		}
	}
victorwss
malstryx:
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();
		}
	}

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);
M
victorwss:
malstryx:
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();
		}
	}

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);

Agora sim :D , vlw mesmo victor.

renatocustodio

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

victorwss

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

renatocustodio

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

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

victorwss

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

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

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

S

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();  
          }  
      }
Criado 6 de outubro de 2008
Ultima resposta 9 de nov. de 2008
Respostas 13
Participantes 5