Mi a probléma itt, a keylistener-emmel? (JAVA)
Elkezdtem írni egy programot.
Még csak annyit szeretnék tőle, hogy legyen egy kép, ami a nyilak lenyomásakor "arréb" megy/ugrik, de mintha nem érzékelné a gombokat, egyáltalán.
A program elindul, és nincs hiba üzenet.
Mi ebben a kódban a probléma:
Menu.java:
class Menu {
public static void main(String[] args) {
start go = new start();
go.main();
}
}
class start {
void main() {
mozgas rajta = new mozgas();
rajta.menet();
}
}
(Menu.java vége)
Mozgas.java:
import java.applet.Applet;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class mozgas
extends Applet
implements KeyListener{
JFrame keret;
palya field;
int irany;
int x=33;
int y=33;
void menet() {
keret = new JFrame("Snake");
field = new palya();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
keret.getContentPane().add(BorderLayout.CENTER, field);
keret.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
keret.setSize(1200,678);
keret.setVisible(true);
}
@Override
public void keyPressed(KeyEvent e){
irany = e.getKeyCode();
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {x = x+32;}
switch (irany) {
case KeyEvent.VK_LEFT: //balra
y = y-32;
break;
case KeyEvent.VK_UP: //fel
x = x-32;
break;
case KeyEvent.VK_RIGHT: //jobbra
y = y+32;
break;
case KeyEvent.VK_DOWN: //le
x = x+32;
break;
default: x = x+32;
}
x=x+32;
field.repaint();
}
@Override
public void keyTyped(KeyEvent e){
}
@Override
public void keyReleased(KeyEvent e){
}
class palya extends JPanel {
@Override
public void paintComponent (Graphics g) {
super.paintComponent(g);
Color c = new Color(130,130,130);
g.setColor(c);
g.fillRect(8,8,624,624);
c = new Color(238,238,238);
g.setColor(Color.WHITE);
g.fillRect(30,30,578,578);
Image kep = new ImageIcon("kocka.png").getImage();
g.drawImage(kep,x,y,this);
}
}
}
(Mozgas.java vége)
Tudom, hogy vannak benne fölös részek, de egy részük azért, mert későbbre kell, egy része, meg azért, mert próbáltam életre hívni, bármilyen fajta mozgást (e miatt vannak értelmetlennek tűnő sorok, de ezektől, max furán kéne mozognia).
A rajzolással elvileg semmi gond, mert amikor csak egy ciklussal változtatta az x/y értéket, akkor mozgott rendesen.
A kérdés, hogy miért nem érzékeli a gombnyomást, vagy miért nem mozog egyáltalán?
Előre is köszönöm.
> miért nem érzékeli a gombnyomást, vagy miért nem mozog egyáltalán?
Elsőként derítsd ki, a kettő közül mi nem működik.
1. Tegyél egy kiíratást a gombnyomást elkapó metódusodba.
2. Tegyél egy kiíratást a paint metódusodba.
Így látni fogod mi fut le, mi nem.
Ami nekem amúgy szemet szúr, gyanús: a "palya" nevű osztályban használsz x és y változót, de azok hol kapnak értéket???
További javaslat: próbáld meg követni a Java névkonvencióit (pl. osztálynevek mindig nagybetűvel kezdődnek), magadnak is segítesz átlátni a programot.
> x és y változót, de azok hol kapnak értéket?
Jó, látom már, egy fájlban vannak, de nekem akkor is gyanús. Próbáld meg adattagként definiálni a "palya"-ban is és setterekkel add oda neki az új értéket mindig, hátha.
A Paint metódusnak működnie kell, mert amikor ciklussal változtattam x/y értéket, akkor szépen ment arrébb a kép.
A gomb lenyomásánál kell a problémának lennie, mert bármit írok oda, nem történik semmi.
Az x, és y, még deklarálásnál kap kezdő értéket (33), és a keypressed változtatná a nyilak megnyomásakor, ha működne.
1.) [link] talán...
2.) Legközelebb valami olyan helyre tedd fel a forráskódot, ahol van kiemelés, vagy legalább indentálás!
3.) A Java osztályokat nagy kezdőbetűvel íjuk.
A x/y, most a palya-ban definiáltam, és setterekkel változattam, de ugyan úgy nem érzékeli a gomb nyomást :/
(a setterek működnek, kipróbáltam)
Az "addKeyListener"-t jól adtam hozzá?
Mert az az egyetlen része, amit nem tudom, hogy pontosan hogyan működik.
A nagy kezdőbetűkben igazatok van, bocsánat.
Átírtam minden osztályt nagybetűre, és mindent, ami hivatkozik rá.
Tengor:
Köszi, de szerintem nem ezzel a rajzolás és újra rajzolás résszel van a baj, mert az külön, működött.
Már majdnem feladtam, de megvan! :D
addKeyListener(this); < ez az utasításod a Mozgas objektumodra vonatkozik (ekvivalens a this.addKeyListener(this); ), azért adhatod ki így az utasítást, mert egy Appletből származtatod és az Appletnek van ilyen függvénye.
Viszont a menet() függvény végén a keret nevá JFrame-et jeleníted meg és nem a Mozgas Aplletet.
A keretnek add a fókuszt és arra tedd rá a billentyűzet figyelőt és jó lesz!
Ezt pontosan hogyan tegyem?
Én csináltam egy: Public Menet() függvényt, ebbe tettem, ehhez társítottam a fókuszt, figyelőt, mindent, és azt adtam hozzá a kerethez, de nem működött.
A JFrame-hez közvetlen, nem engedte adni.
(mert nem statikus vagy valami ilyesmi hiba üzenet van.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!