Avatar billede ng-km Nybegynder
05. januar 2003 - 20:22 Der er 3 kommentarer og
1 løsning

getContentPane blokerer for keylistener, hvorfor?

Denne kode virker perfekt under jre/jdk 1.3, men under 1.4 virker min keylistener ikke. Hvis jeg udkommenterer    getContentPane().add(knap)    ; virker KeyListener metoderne imidlertid igen.

Hvordan får jeg den samlede kode til at virke under jdk 1.4, som den gør under 1.3, så jeg kan bruge både en GUI-knap(getContentPane().add(knap)) og tastaturknap(keylistener)?


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class TestKeys extends JFrame implements KeyListener, ActionListener
{
    JButton knap;
   
    public TestKeys()
  {
    setSize(200,200);
    setTitle("Testkeys");
        addKeyListener(this);

    knap = new JButton("Luk");
    knap.addActionListener(this);
    getContentPane().add(knap);//udkommenter denne linie
  }
 
  public void keyPressed(KeyEvent e) {System.out.println("keyPressed");}
    public void keyTyped(KeyEvent e){System.out.println("keyTyped");}
  public void keyReleased(KeyEvent e)
    {
      if(e.getKeyCode() == KeyEvent.VK_F3)
      {
          System.out.println("keyReleased");
          knap.doClick();
      }
      if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
      {
          System.exit(0);
      }
    }
   
    public void actionPerformed(ActionEvent event)
    {
        Object source = event.getSource();
        if(source == knap)
        {
            System.exit(0);
        }
    }
   
    public static void main(String args[])
    {
        TestKeys testKeys = new TestKeys();
        testKeys.setVisible(true);
    }
}
Avatar billede arne_v Ekspert
05. januar 2003 - 20:48 #1
Bruger du 1.4.1_01 ?
Avatar billede ng-km Nybegynder
06. januar 2003 - 09:55 #2
Ja! Jeg har prøvet 1.4.0 -> 1.4.1_01
Avatar billede carstenknudsen Nybegynder
06. januar 2003 - 10:31 #3
Du skal tilføje din keylistener der hvor du vil
lytte, det kunne f.eks. være på knap i dit eksempel.
At tilføje en keylistener til en JFrame er ikke
hensigtsmæssigt, f.eks. betyder det at der skal
lyttes på samtlige komponenter i JFrame'n og hvad
så med de komponenter der i forvejen har listenere?
En JFrame er sædvanligvis fyldt op med andre komponenter
og der er ikke nødvendigvis noget område der er tomt
hvor man kunne sige at der naturligt skulle lyttes
efter key events. Hvis du istedet for
addKeyListener(this) skriver knap.addKeyListener(this)
skulle det virke.
Avatar billede ng-km Nybegynder
06. januar 2003 - 22:32 #4
Jeg er ikke en stor haj til Java, men netop en KeyListener er vel ikke beregnet til at lytte på GUI-komponenter, men på tastatur-input, der så knyttes til et eller andet i min JFrame.

Hvad med f.eks en quick-tast(F1) til hjælp, hvilke komponent skal jeg add'e min keylistener, hvis der ikke lige er en hjælpeknap på min GUI. Eller en mulighed for at lukke en pop-up dialog med Escape-knappen. Der må være en anden løsning, som i 1.3, det virker mere logisk at tilføje keylistener til den aktuelle Frame/dialog.

Jeg har arbejdet lidt med din løsning, og den virker til dels, men på en for mig helt u-forståelig måde. Hvis der er JTextFields, SKAL ALLE textfelter have en keylistener add'et,
hvis der kun er knapper, skal bare een af knapperne have en keylistener, uanset om den aktuelle knap har behov for tastatur-input. Jeg har også prøvet at lave en dialog der skal lukkes ved tryk på Escape, og det virkede hvis jeg add'ede keylisteneren til en JList. Det giver ikke en logisk Java-mening, og slet ikke nogen køn kode, men det virker, og du skal selvfølgelig have dine point, men jeg håber at andre kan komme med en lidt pænere løsning, for jeg forstår ikke meningen, selvom jeg ved der er en mening.

Men tak for hjælpen alligevel.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester