/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
prob. med at fange keyevents
Fra : Morten Nørgaard


Dato : 24-09-02 07:57

Hej,

håber at nogen har mere forstand på event-handlers end jeg (skulle ikke
være umuligt).

Jeg har en klasse, der består af et JPanel med et JTextField
("ImagePanel1", se nedenst.). Denne klasse instantierer jeg i en anden
klasse ("BeanTest1"). Nu vil jeg gerne i min anden klasse "BeanTest1" fange
tastetryk i "ImagePanel1" klassen. Dvs., hvis nogen trykker på en tast i
tekstfeltet, skal det opfanges af hovedklassen - ikke ImagePanel1-klassen,
som man ellers nok normalt ville gøre det.

Det virker sandsynligt at det skulle kunne lade sig gøre, men ...
hvordan?


ImagePanel1-klassen:

public class ImagePanel1 extends JPanel
{
JTextField dataLabel = null;

public ImagePanel1( String valueLabel )
{
dataLabel = new JTextField( valueLabel );
add( dataLabel );
}
};


BeanTest1-klassen (m. main).

public class BeanTest1 extends JPanel
{
public BeanTest1()
{
ImagePanel1 p = new ImagePanel1("test");
// tilføj keyListener til p, for at fange dets tastetryk - virker ikke!!
p.addKeyListener( new KeyAdapter()
{ public void keyPressed(KeyEvent e) { JOptionPane.showMessageDialog(
null, "test"); } }
);
add( p );
}

public static void main( String args[] )
{
BeanTest1 ny_opgave = new BeanTest1();
JFrame app = new JFrame( "beantest" );
app.setSize( 100, 100 );
app.getContentPane().add( ny_opgave, BorderLayout.CENTER );
app.show();
}
}

Mvh.

Morten



 
 
Lars Dam (24-09-2002)
Kommentar
Fra : Lars Dam


Dato : 24-09-02 09:37

On Tue, 24 Sep 2002 08:57:09 +0200, "Morten Nørgaard"
<morten.norgaard@uni-c.dk> wrote:

>Hej,
>
> håber at nogen har mere forstand på event-handlers end jeg (skulle ikke
>være umuligt).
>
> Jeg har en klasse, der består af et JPanel med et JTextField
>("ImagePanel1", se nedenst.). Denne klasse instantierer jeg i en anden
>klasse ("BeanTest1"). Nu vil jeg gerne i min anden klasse "BeanTest1" fange
>tastetryk i "ImagePanel1" klassen. Dvs., hvis nogen trykker på en tast i
>tekstfeltet, skal det opfanges af hovedklassen - ikke ImagePanel1-klassen,
>som man ellers nok normalt ville gøre det.
>
> Det virker sandsynligt at det skulle kunne lade sig gøre, men ...
>hvordan?

Det er sikkert fordi dit jtextpane har fokus. Kun een komponent kan
have fokus ad gangen, så det du kan gøre er f.eks. at delegere din
addKeyListener på imagepanel videre til jtextarea:

>
>ImagePanel1-klassen:
>
>public class ImagePanel1 extends JPanel
>{
> JTextField dataLabel = null;
>
> public ImagePanel1( String valueLabel )
> {
> dataLabel = new JTextField( valueLabel );
> add( dataLabel );
> }
public void addKeyListener( KeyListener kl ){
dataLabel.addKeyListener(kl);
}
>};
>
>
>BeanTest1-klassen (m. main).
>
>public class BeanTest1 extends JPanel
>{
> public BeanTest1()
> {
> ImagePanel1 p = new ImagePanel1("test");
> // tilføj keyListener til p, for at fange dets tastetryk - virker ikke!!
> p.addKeyListener( new KeyAdapter()
> { public void keyPressed(KeyEvent e) { JOptionPane.showMessageDialog(
>null, "test"); } }
> );
> add( p );
> }
>
> public static void main( String args[] )
> {
> BeanTest1 ny_opgave = new BeanTest1();
> JFrame app = new JFrame( "beantest" );
> app.setSize( 100, 100 );
> app.getContentPane().add( ny_opgave, BorderLayout.CENTER );
> app.show();
> }
>}
>
>Mvh.
>
>Morten
>

vh. ld

---
"Time is the fire in which we burn"

Morten Nørgaard (24-09-2002)
Kommentar
Fra : Morten Nørgaard


Dato : 24-09-02 10:32

Hej, tak for dit svar,

> public void addKeyListener( KeyListener kl ){
> dataLabel.addKeyListener(kl);
> }

det virker som det skal. Men jeg er ikke sikker på at jeg helt har forstået
løsningen, omend den sikkert er meget simpel. Jeg tilføjer en keylistener
til mit instantierede objekt, som opfanger keypresses i min hovedklasse. Men
jeg skal også tilføje en keyListener til min ImagePanel1-klasse, som
åbenbart binder sig til keylistener'en på hovedklassen. Hvordan ved min
ImagePanel1 keylistener," public void addKeyListener( KeyListener kl )", at
den skal henvende sig hos keylisteneren i hovedklassen?

Løsningen er fin. Jeg skal bare lige forstå den... :-?

/Morten.



> Jeg har en klasse, der består af et JPanel med et JTextField
>("ImagePanel1", se nedenst.). Denne klasse instantierer jeg i en anden
>klasse ("BeanTest1"). Nu vil jeg gerne i min anden klasse "BeanTest1" fange
>tastetryk i "ImagePanel1" klassen. Dvs., hvis nogen trykker på en tast i
>tekstfeltet, skal det opfanges af hovedklassen - ikke ImagePanel1-klassen,
>som man ellers nok normalt ville gøre det.
>
> Det virker sandsynligt at det skulle kunne lade sig gøre, men ...
>hvordan?

Det er sikkert fordi dit jtextpane har fokus. Kun een komponent kan
have fokus ad gangen, så det du kan gøre er f.eks. at delegere din
addKeyListener på imagepanel videre til jtextarea:

>
>ImagePanel1-klassen:
>
>public class ImagePanel1 extends JPanel
>{
> JTextField dataLabel = null;
>
> public ImagePanel1( String valueLabel )
> {
> dataLabel = new JTextField( valueLabel );
> add( dataLabel );
> }
public void addKeyListener( KeyListener kl ){
dataLabel.addKeyListener(kl);
}
>};
>
>
>BeanTest1-klassen (m. main).
>
>public class BeanTest1 extends JPanel
>{
> public BeanTest1()
> {
> ImagePanel1 p = new ImagePanel1("test");
> // tilføj keyListener til p, for at fange dets tastetryk - virker ikke!!
> p.addKeyListener( new KeyAdapter()
> { public void keyPressed(KeyEvent e) { JOptionPane.showMessageDialog(
>null, "test"); } }
> );
> add( p );
> }
>
> public static void main( String args[] )
> {
> BeanTest1 ny_opgave = new BeanTest1();
> JFrame app = new JFrame( "beantest" );
> app.setSize( 100, 100 );
> app.getContentPane().add( ny_opgave, BorderLayout.CENTER );
> app.show();
> }
>}
>
>Mvh.
>
>Morten
>



Lars Dam (24-09-2002)
Kommentar
Fra : Lars Dam


Dato : 24-09-02 11:39

On Tue, 24 Sep 2002 11:32:29 +0200, "Morten Nørgaard"
<morten.norgaard@uni-c.dk> wrote:

>Hej, tak for dit svar,
>
>> public void addKeyListener( KeyListener kl ){
>> dataLabel.addKeyListener(kl);
>> }
>
>det virker som det skal. Men jeg er ikke sikker på at jeg helt har forstået
>løsningen, omend den sikkert er meget simpel. Jeg tilføjer en keylistener
>til mit instantierede objekt, som opfanger keypresses i min hovedklasse. Men
>jeg skal også tilføje en keyListener til min ImagePanel1-klasse, som
>åbenbart binder sig til keylistener'en på hovedklassen. Hvordan ved min
>ImagePanel1 keylistener," public void addKeyListener( KeyListener kl )", at
>den skal henvende sig hos keylisteneren i hovedklassen?
>
>Løsningen er fin. Jeg skal bare lige forstå den... :-?

Dit panel indeholder et textpane. Kun een af disse kan have fokus ad
gangen.

Ved at overstyre addKeyListener i dit panel til at 'delegere'
metodekaldet videre til datalabel's addKeyListener vil din keylistener
lytte til keyevents på dette, istedet for på dit hovedpanel.


Det er ret simpelt. Hvis det er keylistener du ikke forstår, så prøv
at søg på google efter "design patterns publish subscribe", idet
keylisteners (og alle andre listener konstruktioner i java) er
implementeret efter dette princip.

Hvis der er noget du gerne vil have uddybet, så stil et sepcifikt
spørgsmål.


>/Morten.

vh. ld

---
"Time is the fire in which we burn"

Morten Nørgaard (24-09-2002)
Kommentar
Fra : Morten Nørgaard


Dato : 24-09-02 12:01

Hej,

jeg tror jeg har fanget det. Jeg har blot været vant til at hvis en
klasse tilføjer en addKeyListener, skal den også implementere KeyListener
interfacet. Så jeg blev lidt forvirret. Men som sagt, jeg mener at have
fattet det.

TAK for løsningen,

mvh.

Morten


>
> Dit panel indeholder et textpane. Kun een af disse kan have fokus ad
> gangen.
>
> Ved at overstyre addKeyListener i dit panel til at 'delegere'
> metodekaldet videre til datalabel's addKeyListener vil din keylistener
> lytte til keyevents på dette, istedet for på dit hovedpanel.
>
>
> Det er ret simpelt. Hvis det er keylistener du ikke forstår, så prøv
> at søg på google efter "design patterns publish subscribe", idet
> keylisteners (og alle andre listener konstruktioner i java) er
> implementeret efter dette princip.
>
> Hvis der er noget du gerne vil have uddybet, så stil et sepcifikt
> spørgsmål.
>
>
> >/Morten.
>
> vh. ld
>
> ---
> "Time is the fire in which we burn"



Lars Dam (24-09-2002)
Kommentar
Fra : Lars Dam


Dato : 24-09-02 12:25

On Tue, 24 Sep 2002 13:00:39 +0200, "Morten Nørgaard"
<morten.norgaard@uni-c.dk> wrote:

>Hej,
>
> jeg tror jeg har fanget det. Jeg har blot været vant til at hvis en
>klasse tilføjer en addKeyListener, skal den også implementere KeyListener
>interfacet. Så jeg blev lidt forvirret. Men som sagt, jeg mener at have
>fattet det.

Det behøver ikke være din klasse der absolut skal implementere
KeyListener. Det kan også være en anonymous class:

class X extends JFrame
{
public void someInit(){
addKeyListener( new KeyListener(){
public void keyPressed...
etc.
});
}
}

Eller en Inner class:

class X extends JFrame
{
public void someInit(){
addKeyListener( new MyKeyListener() );
}
private class MyKeyListener implements KeyListener{
etc...
}
}


>TAK for løsningen,
>
>mvh.
>
>Morten

---
"Time is the fire in which we burn"

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste