Avatar billede mmkit Nybegynder
26. januar 2005 - 12:23 Der er 14 kommentarer og
1 løsning

Problemer med et JComponent

Hej,

jeg har en klasse:
public class DrawArea extends JComponent implements MouseInputListener, KeyListener
mit problem er at jeg kan ikke komme til at lytte til tastaturet, musen er der ingen problemer med.
I klassens konstruktor har jeg skrevet:
public DrawArea() {
        ...
        addMouseListener(this);
        addMouseMotionListener(this);
        addKeyListener(this);
        ...
    }
De tre funktioner man skal have med for at overholde KeyListener interfacet ser sådan her ud:

public void keyPressed(KeyEvent e) {
  System.out.println("halløj");
  switch(e.getKeyCode()){
          case KeyEvent.VK_SPACE :  vertical = false;
  }
  repaint();
}

Som det fremgår af koden er det "space" jeg gerne vil lytte til, men lige meget hvad jeg trykker på sker der intet, den burde i det mindste skrive "halløj" ud.

På forhånd tak for hjælpen

MMK
   
    public void keyTyped(KeyEvent e) { }
    public void keyReleased(KeyEvent e) { }
Avatar billede di8leva Nybegynder
26. januar 2005 - 12:30 #1
Hvad indeholder DrawArea? Hvis du f.eks tar tilføjet en JPanel i din DrawArea så kommer java ikke at fortelle din keyListener hvis focus er i din JPanel og ikke i selve DrawArea.
Avatar billede snoop_one Nybegynder
26. januar 2005 - 12:35 #2
Det kan være at din component ikke har fokus. Prøv evt.
at give den fokus i din applikation med,

requestFocusInWindow();
Avatar billede mmkit Nybegynder
26. januar 2005 - 13:23 #3
Det eneste jeg har i vinduet er JComponent, ingen knapper eller noget andet. Jeg har en JFrame og det eneste jeg har tilføjet til dens ContentPane er DrawDemo der extend'er JComponent. Jeg har prøvet med requestFocus() men det virker ikke, heller ikke requestFocusInWindow(); som snoop foreslog virker.
Avatar billede snoop_one Nybegynder
26. januar 2005 - 13:26 #4
Hvad kalder du requestFocusInWindow() på?
Avatar billede mmkit Nybegynder
26. januar 2005 - 13:29 #5
jeg kalder den inde i min DrawArea konstruktor:

public DrawArea() {
        //sætter størrelsen på elementet der skal tegnes
        width = 10;
        height = 30;
       
        setBackground(Color.WHITE);
        setOpaque(true);
       
        addKeyListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
        requestFocusInWindow();
    }
Avatar billede di8leva Nybegynder
26. januar 2005 - 13:47 #6
Jeg skulle gerne se den fulde kod, så blivet det meget nemmere at finde fejlen
Avatar billede snoop_one Nybegynder
26. januar 2005 - 13:48 #7
Her er et eksempel,


import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Draw extends JFrame {

    public Draw() {
        super("Demo");
        DrawArea area = new DrawArea();
        add(area);
        setPreferredSize(new Dimension(100, 100));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        area.requestFocusInWindow();
    }

    public static void main(String... args) {
        Draw application = new Draw();
        application.setVisible(true);
    }

    class DrawArea extends JComponent implements KeyListener {
        public DrawArea() {
            addKeyListener(this);
        }
        public void keyTyped(KeyEvent e) {
        }
        public void keyPressed(KeyEvent e) {
            System.out.println("Key Pressed " + e.getKeyCode());
        }
        public void keyReleased(KeyEvent e) {
        }
    }
}

Bemærk, at requestFocusInWindow() bliver kaldt efter pack(). Dette er essentielt.
Avatar billede mmkit Nybegynder
26. januar 2005 - 14:02 #8
Avatar billede di8leva Nybegynder
26. januar 2005 - 14:13 #9
nå, jeg syns det var en underlig måde at sætte op det på, men med lidt ændring så virker det:

------------------------------
    private DrawArea buildUI(Container container) {
        container.setLayout(new BoxLayout(container,
                                          BoxLayout.PAGE_AXIS));

        DrawArea Area = new DrawArea();
        container.add(Area);
   
        //Align the left edges of the components.
        Area.setAlignmentX(Component.LEFT_ALIGNMENT);
        return Area;
  }
-------------------------------
        //Set up the content pane.
        DrawDemo controller = new DrawDemo();
        DrawArea area = controller.buildUI(frame.getContentPane());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
        area.requestFocusInWindow();
-------------------------------
Avatar billede snoop_one Nybegynder
26. januar 2005 - 14:16 #10
Bemærk at requestFocusInWindow() bliver kaldt efter pack() ;)
Avatar billede di8leva Nybegynder
26. januar 2005 - 14:17 #11
:) Hvis der er nogle points så er de dine snoop.... det er din løsning som jeg tastede in hurtigare
Avatar billede snoop_one Nybegynder
26. januar 2005 - 14:20 #12
For min skyld kan pointene vel deles ;)
Avatar billede mmkit Nybegynder
26. januar 2005 - 14:25 #13
Mange tak for hjælpen.
Jeg er imponeret over hvor hurtigt i har svaret :)
Jeg har trykket på "accepter" så snoop skulle have fået nogen point
Avatar billede di8leva Nybegynder
26. januar 2005 - 14:37 #14
=)
Avatar billede snoop_one Nybegynder
26. januar 2005 - 15:11 #15
venter på de point ;0)
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