Olá, sou beeeem novato nessa área do Swing, AWT, etc. e eu gostaria de saber, como adicionar uma simples imagem no JFrame e poder manipula-la com um método por exemplo, moverImagemX(int x) e moverImagemY(int y)?
Grato, desde já
Gustavo Borba.
Olá, sou beeeem novato nessa área do Swing, AWT, etc. e eu gostaria de saber, como adicionar uma simples imagem no JFrame e poder manipula-la com um método por exemplo, moverImagemX(int x) e moverImagemY(int y)?
Grato, desde já
Gustavo Borba.
se foi o que entendi você pode colocar a imagem num JLabel e mover o JLabel…
Serviria, o problema é que eu não sei como fazer pode me ajudar?
O que você vai fazer que necessita de movimentação de imagem? Pergunto isso pois a resposta para sua dúvida depende da resposta dessa pergunta.
Eu possuo um simples código que cria um JFrame e ao pressionar as VirtualKeys UP, DOWN, LEFT, e RIGHT eu queria adicionar uma imagem que seria o jogador. O personagem (Imagem) iria se movimentar.
Então é para um jogo? Você pode até usar um JLabel, mas não seria a maneira correta.
O usuário do fórum ViniGodoy manja muito desse assunto e tem um site bem legal.
E eu recentemente iniciei um projeto de uma engine para jogos em Java 2D. Ainda está em fase de desenvolvimento, mas já tem alguns recursos e exemplos (poucos mas tem!).
Mas respondendo à sua pergunta: crie uma classe que extenda JPanel (é aí que seu jogo será renderizado) e sobreescreva o método paint(Graphics), colocando nele o código necessário para desenhar a imagem. Algo como:
public void paint(Graphics g) {
// aqui, pressupõe-se que você já tem a imagem carregada e que a posição dela está armazenada nas variáveis posX e posY
g.drawImage(imagem, posX, posY, this);
}
E no método keyPressed(KeyEvent) você atualizaria a posição X e Y de acordo com as teclas pressionadas.
De acordo com suas informações elaborei meu simples código da classe para desenhar a imagem:
[code]class DrawJPanel extends JPanel {
@Override
public void paint(Graphics g) {
Jogo coordsXY = new Jogo();
Image player = new ImageIcon("player.jpg").getImage();
g.drawImage(player, 200, 162, this);
}
}[/code]
e no método main eu o chamei:
DrawJPanel iniDP = new DrawJPanel();
iniDP.setVisible(true);
Eu já tenho meu JFrame. então pelo que eu entendi eu estaria adicionando o painel com a imagem à ele, só que a imagem não aparece o_o, o JFrame abre certinho, mais a imagem não aparece.
Basta adicionar este JPanel a um JFrame que funcionará. Tem uns comentários para ajudar na compreensão:
import static java.awt.event.KeyEvent.VK_DOWN;
import static java.awt.event.KeyEvent.VK_LEFT;
import static java.awt.event.KeyEvent.VK_RIGHT;
import static java.awt.event.KeyEvent.VK_UP;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class DrawJPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image player;
private int x, y;
public DrawJPanel() {
setPreferredSize(new Dimension(800, 600));
// carrego a imagem uma vez só, e não dentro de paint()
try {
player = ImageIO.read(getClass().getResource("/player.png"));
} catch (IOException e) {
e.printStackTrace();
return;
}
// adiciono o KeyListener que irá controlar a posição do jogador
// apesar de estar feito assim, o mais correto é criar um classe
// que tenha como atributos a imagem e a posição dela
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case VK_DOWN:
y += 5;
break;
case VK_UP:
y -= 5;
break;
case VK_LEFT:
x -= 5;
break;
case VK_RIGHT:
x += 5;
break;
default:
break;
}
// é necessário chamar repaint()
// o mais correto seria ter uma Thread que ficasse fazendo
// isso constantemente
repaint();
}
});
// posições iniciais
x = 200;
y = 200;
}
@Override
public void paint(Graphics g) {
// chama o método de JPanel
super.paint(g);
// e desenha a imagem
g.drawImage(player, x, y, this);
}
@Override
public void addNotify() {
super.addNotify();
// faz um requisição de foco
requestFocusInWindow();
}
}
Para a movimentação ficar suave, você terá que controlar também o tempo do loop.
Ou usar o JavaFX.
No meu site tem dois artigos falando sobre animação, um deles recentemente postado por um autor convidado. Seria uma boa você dar uma lida. Meu próximo post, esse domingo, também será sobre esse tema, usando daí a linguagem java.
ESTOU COMPLETAMENTE DESESPERADO! ESTOU A MAIS DE 3 DIAS SEM PARAR PARA FAZER ISSO VOU POSTAR MEU CÓDIGO INTEIRO!, POR FAVOR SE VOCÊ SOUBER O PROBLEMA DIGA-ME POR FAVOR!:
[code]/*
/**
*
import static java.awt.event.KeyEvent.VK_DOWN;
import static java.awt.event.KeyEvent.VK_LEFT;
import static java.awt.event.KeyEvent.VK_RIGHT;
import static java.awt.event.KeyEvent.VK_UP;
public class Jogo extends JFrame {
public Jogo() {
this.setTitle("Jogo da Bolinha - Feito por Gustavo.");
this.setSize(400, 325);
this.setLayout(null);
this.setLocationRelativeTo(null);
DrawJPanel iniDP = new DrawJPanel();
iniDP.setVisible(true);
this.setVisible(true);
}
public static void main(String[] args) {
Jogo iniJogo = new Jogo();
iniJogo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
iniJogo.getContentPane().setBackground(Color.BLACK);
}
}
class DrawJPanel extends JPanel {
private Image player;
private int X, Y;
public DrawJPanel() {
setBackground(Color.BLACK);
try {
player = ImageIO.read(getClass().getResource("player.png"));
} catch (IOException e) {
e.printStackTrace();
return;
}
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case VK_DOWN:
Y += 5;
break;
case VK_UP:
Y -= 5;
break;
case VK_LEFT:
X -= 5;
break;
case VK_RIGHT:
X += 5;
break;
}
repaint();
}
});
X = 200;
Y = 162;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(player, X, Y, this);
}
@Override
public void addNotify() {
super.addNotify();
requestFocusInWindow();
}
}[/code]
Remova sua linha 27 (não mude o leiaute para null, pois senão você precisará usar setBounds() para que o JPanel apareça).
Você precisa adicionar o seu objeto DrawJPanel no JFrame! Mude a linha 31 para isso:
add(iniDP);
Apesar do que acabei de postar “resolver” o problema, repito: não é esse o caminho mais correto.
Ele seria: estudar Threads e criar uma classe responsável pelo loop do jogo (atualizar informações, redesenhar a tela e dormir).