jmeMedlem sedan maj 20012 237 inlägg Hej!
Jag har försökt koppla en keyListener till en JApplet.
public class Blabla extends JApplet implements KeyListener
...
...
...
getContentPane().addKeyListener(this);
det funkar inte med ovanstående kod men om jag kopplar den till en JTextArea så funkar det prima.
Var och hur gör jag fel?
LimeMedlem sedan sep. 2001961 inlägg Grejen är att du inte skall försöka lyssna på contentPane() eftersom den containern är implementerad så att den bara bubblar vidare alla events. Orsaken till det är att man alltid lägger andra komponenter över contentPane och skulle man lyssna på contentePane så skulle det kunna bli fel. Ska jag lyssna på JTextArean eller contentPane.
Vad man då gör, om man t.ex. gör ett spel som ska lyssna på knapptryckningar, är att man kopplar en generell lyssnare till JAppleten, alltså själva framen, såhär:
/*
* KeyListenerApplet.java
*
* Created on den 20 augusti 2002, 10:39
*/
/**
*
* @author Lime
*/
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class KeyListenerApplet extends javax.swing.JApplet implements KeyListener {
JLabel label = new JLabel("No button pressed");
public void init(){
this.addKeyListener(this);
this.getContentPane().add(label, BorderLayout.NORTH);
}
/** Creates a new instance of KeyListenerApplet */
public KeyListenerApplet() {
}
public void keyPressed(java.awt.event.KeyEvent keyEvent) {
label.setText(keyEvent.getKeyChar() + " pressed");
}
public void keyReleased(java.awt.event.KeyEvent keyEvent) {
label.setText(keyEvent.getKeyChar() + " released");
}
public void keyTyped(java.awt.event.KeyEvent keyEvent) {
label.setText(keyEvent.getKeyChar() + " typed");
}
}
Då funkar det.
/Lime
jmeMedlem sedan maj 20012 237 inlägg Tack för förklaringen. :)
Jag lyckades dock få det att fungera.
Om jag vet rätt så kan man strunta i att inkludera "this." för det gör väl kompilatorn annars?
LimeMedlem sedan sep. 2001961 inlägg Jepp, man kan göra det, men det ökar läsbarheten tycker jag.
getContentPane() och this.getContentPane() är likvärdiga.
Men ponera att du har en variabel som du får in i anropet public void getMeThis(int alfa) som skall läggas i int alfa i din klass... alltså
int alfa;
public void getMeThis(int alfa){
alfa = alfa;
}
Detta funkar inte för då refererar du till samma alfa. Där vill man skriva this.alfa = alfa.
Inte riktigt samma sak, men jag tycker att this är smutt att använda... :-)
/Lime
jmeMedlem sedan maj 20012 237 inlägg En följdfråga... :)
Jag fick det att fungera med this.addKeyListener(this);
Men nu när jag försöker skapa en layout
getContentPane().setLayout(new BorderLayout() );
getContentPane().add(btn = new JButton("Start game"), BorderLayout.SOUTH );
så slutar knapparna att fungera.
om jag kommenterar ovanstående rader så fungerar allt igen...
LimeMedlem sedan sep. 2001961 inlägg Man bör inte göra "btn = new JButton("Start game"), BorderLayout.SOUTH".
Skapa knappen först, om du tänkte dig att du skulle göra lite annat med den. Alltså
btn_start = new JButton("Start Game");
getContentPane().add(btn, BorderLayout.SOUTH);
Vad din kod gör är att skapa en orefererad variant av knappen... Lite svårt att förklara. Gör inte initieringar och tilldelningar i samma sats om du kan undvika det... Det är fult.
/Lime