Boa noite pessoal, sou novo aqui.
Tenho um dúvida.
Como eu faria pra usar um método KeyListener de uma classe, na classe principal? Eu tentei chamar o método mas não deu certo.
O que exatamente você quer fazer?
Estou fazendo um joguinho simples, com intuito acadêmico, sou estudante ainda. Eu criei uma classe com uma imagem e utilizo o KeyListener pra controlar ela na tela. Na classe principal main eu criei um objeto e chamei o método do KeyListener, porém não consigo controlar a imagem com ele.
Não entendi essa frase.
Quando você cria um listener, você precisa registrar/adicionar esse listener ao objeto que o aceita.
Você não chama os métodos do listener, quem vai chamar os métodos dele é o objeto onde ele foi adicionado.
Posta o código das suas classes que fica fácil identificar onde está errando.
package jogonave;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class NaveJogador extends JFrame{
ImageIcon iconNave = new ImageIcon(getClass().getResource("ship-01.png"));
JLabel lNave = new JLabel(iconNave);
int shipposx = 50;
int shipposy = 300;
public void Nave() {
lNave.setBounds(shipposx, shipposy, 125, 76);
}
public void jogabilidade(){
/*
W = 87; A = 65; S = 83; D = 68;
*/
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == 68) {
lNave.setBounds(lNave.getX() + 5, lNave.getY(), 125, 76);
shipposx += 5;
}
if (ke.getKeyCode() == 65) {
lNave.setBounds(lNave.getX() - 5, lNave.getY(), 125, 76);
shipposx -= 5;
}
if (ke.getKeyCode() == 87) {
lNave.setBounds(lNave.getX() , lNave.getY() - 5, 125, 76);
shipposy -= 5;
}
if (ke.getKeyCode() == 83) {
lNave.setBounds(lNave.getX() , lNave.getY() + 5, 125, 76);
shipposy += 5;
}
}
@Override
public void keyReleased(KeyEvent ke) {
if (ke.getKeyCode() == 68) {
lNave.setIcon(iconNave);
}
if (ke.getKeyCode() == 65) {
lNave.setIcon(iconNave);
}
if (ke.getKeyCode() == 87) {
lNave.setIcon(iconNave);
}
if (ke.getKeyCode() == 83) {
lNave.setIcon(iconNave);
}
}
}
);
}
}
package jogonave;
import javax.swing.JFrame;
public class Tela extends JFrame{
NaveJogador nave = new NaveJogador();
Cenario fase = new Cenario();
public void JanelaJogo() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1024, 700); // números de pixels de x e y respectivamente
setLocationRelativeTo(null);
setVisible(true);
setLayout(null);
add(nave.lNave);
add(fase.lNebulaBlue);
nave.Nave();
fase.nebulablue();
}
}
package jogonave;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class Cenario {
ImageIcon iconNebulaBlue = new ImageIcon(getClass().getResource("Nebula Blue.png"));
JLabel lNebulaBlue = new JLabel(iconNebulaBlue);
public void nebulablue(){
lNebulaBlue.setBounds(0, 0, 4000,4000);
}
}
identar texto pré-formatado por 4 espaços
package jogonave;
public class JogoNave{
public static void main(String[] args) {
Tela screen = new Tela();
screen.JanelaJogo();
NaveJogador controles = new NaveJogador();
controles.jogabilidade();
}
}
Aqui estão a classe que eu utilizei o KeyListener e a classe principal onde chamei o método.
Sei que pode não estar bom, mas é porque sou iniciante na área.Texto pré-formatado
Edita seus posts anteriores e formata o código Java com o botão de Texto pré-formatado, identificado pelo botão </>
.
Posta também o fonte da classe Tela
.
Esse KeyListener
serve para tratar as teclas pressionada na tela NaveJogador
, não faz sentido chamar esse método jogabilidade
na classe JogoNave
.
Eu registraria o listener no próprio construtor da classe NaveJogador
.
Também não faz sentido a classe NaveJogador
ser um JFrame
.
Abaixo um exemplo com o seu JLabel
sendo movido ao pressionar as teclas W, A, S, D
:
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class NaveJogador extends JFrame { // não me parece correto a nave do Jogador ser um JFrame
private static final Image NAVE_PRA_DIREITA = carregarImagem("/ship-01.png"); // aqui você vai usar uma imagem pra cada posição da nave
private static final Image NAVE_PRA_BAIXO = carregarImagem("/ship-01.png");
private static final Image NAVE_PRA_ESQUERDA = carregarImagem("/ship-01.png");
private static final Image NAVE_PRA_CIMA = carregarImagem("/ship-01.png");
private static Image carregarImagem(String caminho) {
try {
InputStream arquivo = NaveJogador.class.getResourceAsStream(caminho);
return ImageIO.read(arquivo);
} catch (IOException e) {
throw new RuntimeException("Não foi possível encontrar a imagem \"" + caminho + "\"", e);
}
}
private JLabel labelNave;
private Point posicao;
private Dimension tamanho;
public NaveJogador() {
posicao = new Point(50, 300);
tamanho = new Dimension(125, 76);
labelNave = new JLabel(new ImageIcon(NAVE_PRA_DIREITA));
labelNave.setBounds(posicao.x, posicao.y, tamanho.width, tamanho.height);
JPanel panel = new JPanel(null);
panel.setFocusable(true);
panel.add(labelNave);
panel.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent ke) {
pressionou(ke.getKeyCode());
}
});
setAutoRequestFocus(true);
setSize(800, 600);
setContentPane(panel);
setLocationRelativeTo(null);
}
private void pressionou(int tecla) {
Image imagem = null;
switch (tecla) {
case KeyEvent.VK_W: // tecla W = cima
posicao.y -= 5;
imagem = NAVE_PRA_CIMA;
break;
case KeyEvent.VK_A: // tecla A = esquerda
posicao.x -= 5;
imagem = NAVE_PRA_ESQUERDA;
break;
case KeyEvent.VK_S: // tecla S = baixo
posicao.y += 5;
imagem = NAVE_PRA_BAIXO;
break;
case KeyEvent.VK_D: // tecla D = direita
posicao.x += 5;
imagem = NAVE_PRA_DIREITA;
break;
default:
return;
}
labelNave.setIcon(new ImageIcon(imagem));
labelNave.setBounds(posicao.x, posicao.y, tamanho.width, tamanho.height);
revalidate();
}
}
Exemplo para rodar a tela:
import javax.swing.JFrame;
public class JogoNave {
public static void main(String[] args) {
try {
NaveJogador tela = new NaveJogador();
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
} catch (Throwable t) {
t.printStackTrace();
}
}
}