Duvida sobre colocar imagem na tela

ola pessoal, estou desenvolvendo um pequeno joguinho, só que a maior dificuldade está sendo criar uma tela para o jogo. eu consegui colocar um boneco na tela e mover com eventos do teclado. esse boneco eu achei na net, portanto não sei como fazer.
a minha duvida é a seguinte, existe algum software no qual eu possa desenhar como sera a cara do meu jogo e importar no java?

Voce pode desenhar no seu editor de imagens favorito como o Paint.NET (Um Photoshop free), ou o Fireworks e etc…

Voce salva como bmp, png, gif, jpg e etc.

E como voce esta adicionando a imagem na tela?

segue abaixo os codigos…no caso se fosse uma aplicação simples, eu faço o desenho em algum desses programa e coloco no frame…eh isso?

import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

public class Logica implements Runnable {

	static long temp = 1;
	private Jogo gamePanel;
	static List<Personagem> personagens = new ArrayList<Personagem>();
	final static int LARGURA = 320;
	final static int ALTURA = 320;

	// Váriavel para finalizar o jogo.
	private boolean running = true;

	public enum Direcao {
		CIMA, DIREITA, BAIXO, ESQUERDA
	}

	public Logica(Jogo panel) {
		this.gamePanel = panel;

		// Criando personagens
		Controle controle1 = new Controle(KeyEvent.VK_UP, KeyEvent.VK_RIGHT,KeyEvent.VK_DOWN, KeyEvent.VK_LEFT);
		Personagem personagem1 = new Personagem(1, "Chara1.png", 100, 100, 24,32, 15);
		personagem1.setControle(controle1);
		personagens.add(personagem1);
	
	
	;
	
		
	

	}

	public void run() {

		long tempAnterior = System.currentTimeMillis();
		while (running) {
			tratarJogo();
			gamePanel.renderizar();
			gamePanel.repaint();
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
			}

			temp = System.currentTimeMillis() - tempAnterior;
			tempAnterior = System.currentTimeMillis();
		}

	}

	private void tratarJogo() {
		moverJogador();
		

	}

	

	private void moverJogador() {
		for (Personagem personagemPrincipal : personagens) {
			Controle controle = personagemPrincipal.getControle();
			int posXAnterior = personagemPrincipal.getPosicaoX();
			int posYAnterior = personagemPrincipal.getPosicaoY();

			if (controle.paraCima) {
				personagemPrincipal.andar(Direcao.CIMA.ordinal());
			}
			if (controle.paraBaixo) {
				personagemPrincipal.andar(Direcao.BAIXO.ordinal());
			}
			if (controle.paraDireita) {
				personagemPrincipal.andar(Direcao.DIREITA.ordinal());
			}
			if (controle.paraEsquerda) {
				personagemPrincipal.andar(Direcao.ESQUERDA.ordinal());
			}

		
		}

	}







}
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;


public class Personagem implements Comparable<Personagem> {

	private int id;		//codigo do personagem
	private int posicaoX, posicaoY; //posição
	private BufferedImage imagem;	//imagem carregada;
	private int direcao = 2;
	private int velocidade;
	private Controle controle;
	public final int tamanhoX, tamanhoY;
	public long anim = 1;

	public Personagem(int id, String img, int posicaoX, int posicaoY,int tamanhoX, int tamanhoY, int velocidade) {
		this.id = id;
		this.posicaoX = posicaoX;
		this.posicaoY = posicaoY;
		this.tamanhoX = tamanhoX;
		this.tamanhoY = tamanhoY;
		this.velocidade = velocidade;
		try {
			imagem = ImageIO.read(getClass().getClassLoader().getResource(img));
		} catch (IOException e) {
			System.out
					.println("Erro ao buscar imagem do personagem.\nEncerrando aplicação");
			System.exit(0);
		}
	}
	

	public void andar(int novaDirecao) {
		direcao = novaDirecao;
		anim++;
		switch (novaDirecao) {
		case 0:
			posicaoY -= (velocidade * Logica.temp) / 100;
			break;
		case 1:
			posicaoX += (velocidade * Logica.temp) / 100;
			break;
		case 2:
			posicaoY += (velocidade * Logica.temp) / 100;
			break;
		case 3:
			posicaoX -= (velocidade * Logica.temp) / 100;
			break;
		}
	}


	public int getPosicaoX() {
		return posicaoX;
	}

	public void setPosicaoX(int posicaoX) {
		this.posicaoX = posicaoX;
	}

	public int getPosicaoY() {
		return posicaoY;
	}

	public void setPosicaoY(int posicaoY) {
		this.posicaoY = posicaoY;
	}

	public BufferedImage getImagem() {
		return imagem;
	}

	public int getDirecao() {
		return direcao;
	}

	public void setDirecao(int direcao) {
		this.direcao = direcao;
	}

	public int getId() {
		return id;
	}


	public Controle getControle() {
		return controle;
	}

	public void setControle(Controle controle) {
		this.controle = controle;
	}

	
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}

		
	public int compareTo(Personagem o) {
		return 0;
	}

}


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


public class Jogo extends JPanel {

	private static final long serialVersionUID = 1L;
	private BufferedImage tela = new BufferedImage(Logica.LARGURA,
			Logica.ALTURA, BufferedImage.TYPE_4BYTE_ABGR);
	public Jogo() {
		setPreferredSize(new Dimension(Logica.LARGURA, Logica.ALTURA));
		setFocusable(true);
		requestFocus();
	}

	public void renderizar() {

		Graphics2D dbg = (Graphics2D) tela.getGraphics();

		

		for (Personagem personagem : Logica.personagens) {

	

			dbg.drawImage(personagem.getImagem(), personagem.getPosicaoX(),
					personagem.getPosicaoY() - 5, personagem.getPosicaoX()
							+ personagem.tamanhoX, personagem.getPosicaoY()
							+ personagem.tamanhoY, (int) (personagem.anim % 3)
							* personagem.tamanhoX, personagem.getDirecao()
							* personagem.tamanhoY,
					(int) (personagem.anim % 3 * personagem.tamanhoX)
							+ personagem.tamanhoX,
					(personagem.getDirecao() * personagem.tamanhoY)
							+ personagem.tamanhoY, null);

		}

	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		g.drawImage(tela, 0, 0, null);
	}

}

Se for o que eu estou pensando é bem simples…

importe o swing depois usa um :