|
| 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"
| |
|
|