21. december 2001 - 14:18
Der er
4 kommentarer og
1 løsning
KeyboardListener
Hej, jeg har lavet et JPanel som ligger i en JFrame. Jeg vil gerne have dette JPanel til at lytte på keyboardevents. Jeg har implementeret KeyboardListener og dens metode, men der sker alligevel ikke noget når jeg trykker på keyboardet. Jeg har bare lavet det simpelt og sat Panelet til selv at være eventhandler. Jeg snublede over noget med noget focus, og bla. en metode der hedder
hasFocus(), som returnerer false når jeg udskriver den. Jeg tænkte at det nok har noget med det at gøre. Men hvordan sætter jeg keyboardfocus på mit jpanel så den lytter på keyboardevents. Tak
21. december 2001 - 16:02
#1
Du mener formodentlig KeyListener. Har du benyttet addKeyListener() metoden med dit JPanel som
listener eller er det din applikation der formentlig nedarver fra JFrame. Hvis din implementering ligger i JFrame\'n nytter det ikke
at tilføje KeyListener\'en på JPanel\'et. Du skulle ikke have behov for at kigge på keyboardfocus, men
selvfølgelig skal du sørge for at der hvor du taster skal den have focus (klik i den med musen). Hvis ikke du har løst problemet selv så lad os se lidt kode.
22. december 2001 - 03:15
#2
Hmmm ok....men jeg svarer ikke for konsekvenserne :) I må se om i kan overskue koden hehe. Nej det er ikke fordi jeg har added keylisteneren det forkerte sted. Men kig selv efter og se om du kan se hvad fejlen er :
Linierne angiver at der starter en ny klasse...
--------------------------------------------------
import javax.swing.*;
import java.awt.Container;
public class samleramme extends JFrame
{
private Container con;
public samleramme()
{
setSize(500,500);
con=getContentPane();
slange spiller=new slange();
spilbraet braet=new spilbraet();
inputHandler actionhandler=new inputHandler(braet,spiller);
con.add(braet);
}
}
--------------------------------------------------
import java.awt.event.*;
import javax.swing.Timer;
public class inputHandler implements ActionListener,KeyListener,FocusListener
{
private boolean op=false;
private boolean ned=true;
private boolean hoejre=false;
private boolean venstre=false;
private int x=50;
private int y=50;
public spilbraet braettet;
public slange spiller;
private Timer ryk_orm;
public inputHandler(spilbraet braet,slange spilleren)
{
braettet=braet;
spiller=spilleren;
braet.addKeyListener(this);
braet.addFocusListener(this);
braet.requestFocus();
braet.grabFocus();
braet.requestDefaultFocus();
System.out.print(braet.hasFocus());
ryk_orm=new Timer(50,this);
ryk_orm.start();
}
int antal=0;
public void actionPerformed(ActionEvent e)
{
if (op==true)
{
y--;
spiller.addPunkt(x,y);
}
if (ned==true)
{
y++;
spiller.addPunkt(x,y);
}
if (hoejre==true)
{
x++;
spiller.addPunkt(x,y);
}
if (venstre==true)
{
x--;
spiller.addPunkt(x,y);
}
braettet.opdater(spiller);
if (antal>=50)
{
spiller.RemovePunkt();
}
antal++;
//System.out.println(antal);
//System.out.println(spiller.punkter.getFirst()+\" \"+spiller.punkter.getLast());
}
public void keyReleased(KeyEvent event)
{
System.out.print(\"hej\");
int tast=event.getKeyCode();
switch (tast)
{
case 37://venstre
venstre=true;
hoejre=false;
op=false;
ned=false;
break;
case 38://op
venstre=false;
hoejre=false;
op=true;
ned=false;
break;
case 39://højre
venstre=false;
hoejre=true;
op=false;
ned=false;
break;
case 40://ned
venstre=false;
hoejre=false;
op=false;
ned=true;
break;
}
}
public void keyTyped(KeyEvent event){ System.out.print(\"hej\");}
public void keyPressed(KeyEvent event){ System.out.print(\"hej\");}
public void focusGained(FocusEvent e){ System.out.print(\"hej\");}
public void focusLost(FocusEvent e){ System.out.print(\"hej\");}
}
--------------------------------------------------
import java.awt.*;
import java.util.LinkedList;
import java.util.Iterator;
import java.util.Enumeration;
public class slange
{
LinkedList punkter;
int stoerrelse;
public slange()
{
punkter=new LinkedList();
stoerrelse=2;
}
void tegn_slange(Color clr,Graphics page)
{
Iterator gogo=punkter.iterator();
page.setColor(clr);
while (gogo.hasNext())
{
Point aktuelt_punkt=(Point)gogo.next();
page.fillRect(aktuelt_punkt.x,aktuelt_punkt.y,6,6);
}
}
void et_punkt(Graphics page)
{
Point nu=(Point)punkter.getLast();
page.setColor(new Color(131,125,245));
page.fillRect(nu.x,nu.y,6,6);
}
void addPunkt(int x,int y)
{
punkter.addFirst(new Point(x,y));
}
void RemovePunkt()
{
punkter.removeLast();
}
}
--------------------------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class spilbraet extends JPanel// implements KeyListener
{
Color bgFarve;
Color slangeFarve;
public spilbraet()
{
bgFarve=new Color(131,125,245);
slangeFarve=new Color(121,12,220);
}
public void paintComponent(Graphics page)
{
page.setColor(bgFarve);
page.fillRect(0,0,500,500);
}
void opdater(slange slange1)
{
slange1.tegn_slange(slangeFarve,getGraphics());
slange1.et_punkt(getGraphics());
}
}
--------------------------------------------------
public class main
{
public static void main(String[]args)
{
samleramme ramme=new samleramme();
ramme.show();
}
}
22. december 2001 - 17:40
#5
Du skal tilføje din KeyListener til JFrame\'en
i stedet for til JPanel\'et. Jeg har prøvet det
og det virker. Der er dog andre problemer med
koden, bla. benytter du en deprecated metode.
Jeg ville i første omgang fjerne FocusListener\'en
indtil resten virker.