Java2D

Olá, estou tentando aumentar e diminuir uma imagem usando as teclas up e down, mas não estou conseguindo…
Está carregando, mas não acontece nada com a imagem.

Se alguém puder dar uma força…

Obrigada.

import java.awt.;
import java.awt.event.
;
import java.applet.;
import java.awt.geom.
;
import java.net.*;

public class DrawImage2 extends Applet implements KeyListener
{
private Image image;

private int x=0;

AffineTransform identity = new AffineTransform();

public URL getURL(String fileName)
{
	URL url=null;
	try
	{
		url=this.getClass().getResource(fileName);
	}
	catch(Exception e)
	{
	}
	return url;
}
public void init()
{
	image = getImage(getURL("asteroid2.png"));
	
	addKeyListener(this);
}
public void paint(Graphics g)
{
	Graphics2D g2d = (Graphics2D)g;
	
	AffineTransform trans = new AffineTransform();
	
	g2d.setColor(Color.BLACK);
	g2d.fillRect(0,0,getSize().width,getSize().height);
	
	trans.setTransform(identity);
	
	trans.scale(40+x,40+x);
	
	g2d.drawImage(image,100,100,this);
}
public void keyReleased(KeyEvent k)
{
}
public void keyTyped(KeyEvent k)
{
}
public void keyPressed(KeyEvent k)
{
	switch(k.getKeyCode())
	{
		case KeyEvent.VK_UP:
		x++;
		repaint();
		break;
		case KeyEvent.VK_DOWN:
		x--;
		repaint();
		break;
	}
}

}

Eu transformei sua applet em um JFrame, mas a idéia é a mesma. A alteração importante é a seguinte:

public void paint(Graphics g) {
		if( image == null )  init(); //esta linha adicionei pois o método init não é chamado no jframe como é numa applet

		Graphics2D g2d = (Graphics2D) g;

		AffineTransform trans = new AffineTransform();

		g2d.setColor(Color.BLACK);
		g2d.fillRect(0, 0, getSize().width, getSize().height);

		//trans.setTransform(identity); -- comentei aqui

		trans.scale(1 + x * 0.1, 1 + x * 0.1); //a escala deve ser modificada. Ela estava muito grande antes. agora o tamanho da imagem é alterado de 10 em 10% para mais ou para menos
		g2d.setTransform(trans);

		g2d.drawImage(image, 100, 100, this);
	}

segue o código completo:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DrawImage2 extends JFrame implements KeyListener {
	private Image image;

	private int x = 0;

	AffineTransform identity = new AffineTransform();

	public DrawImage2() {
	}
	
	public URL getURL(String fileName) {
		URL url = null;
		try {
			url = this.getClass().getResource(fileName);
		} catch (Exception e) {
		}
		return url;
	}

	public void init() {
		try {
			image = ImageIO.read(getURL("asteroid2.jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		addKeyListener(this);
	}

	public void paint(Graphics g) {
		if( image == null )  init();

		Graphics2D g2d = (Graphics2D) g;

		AffineTransform trans = new AffineTransform();

		g2d.setColor(Color.BLACK);
		g2d.fillRect(0, 0, getSize().width, getSize().height);

		//trans.setTransform(identity);

		trans.scale(1 + x * 0.1, 1 + x * 0.1);
		g2d.setTransform(trans);

		g2d.drawImage(image, 100, 100, this);
	}

	public void keyReleased(KeyEvent k) {
	}

	public void keyTyped(KeyEvent k) {
	}

	public void keyPressed(KeyEvent k) {
		switch (k.getKeyCode()) {
		case KeyEvent.VK_UP:
			x++;
			repaint();
			break;
		case KeyEvent.VK_DOWN:
			x--;
			repaint();
			break;
		}
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run(){
				JFrame frame = new DrawImage2();
				frame.setBounds(new Rectangle(new Dimension(400, 400)));
				frame.setVisible(true);
			}
		});
	}
	
}

Agora deu tudo certinho.
Valeu Rogério, muito obrigada pela força.

Só uma pequena correção. É importante copiar o contexto gráfico, antes de altera-lo:

[code] public void paint(Graphics g) {
if( image == null ) init();

     Graphics2D g2d = (Graphics2D) g.create();  //O create faz a cópia do Graphics

     AffineTransform trans = new AffineTransform();  

     g2d.setColor(Color.BLACK);  
     g2d.fillRect(0, 0, getSize().width, getSize().height);  

     //trans.setTransform(identity);  

     trans.scale(1 + x * 0.1, 1 + x * 0.1);  
     g2d.setTransform(trans);  

     g2d.drawImage(image, 100, 100, this);  

     g2d.dispose(); //Aqui vc libera a cópia
 } 

[/code]

Isso evita que sua transformação tenha impacto em locais onde não devia, como na pintura de componentes que venham após esse.

Nossa, faz tanto tempo que não fazia código om Java2D que nem lembrava mais disso. Valeu pela correção.