2012-09-03 2 views
1

Я занялся изучением Java. На данный момент я пытаюсь получить ключевого слушателя, но я борется. Мой код ниже. В первой фигурной скобке в начале анонимного внутреннего класса есть ошибка. Я, вероятно, пропустил что-то простое, поэтому любая помощь была бы полезна.KeyListener help Java

public class Klistener extends JFrame { 

    void Klistener() 
    { 
     JPanel c = new JPanel(); 
     c.setFocusTraversalKeysEnabled(true); 
     this.add(c); 
     c.addKeyListener(new KeyListener() 
     { 


      @Override 
      public void keyTyped(KeyEvent e) 
      { 
       if(e.getKeyCode()==KeyEvent.VK_DOWN) 
       { 
        System.out.print("hi"); 
       } 
      } 

     }); 
    } 

    public static void main(String[] args) 
    { 
     Klistener a = new Klistener(); 
     JFrame b = new JFrame("hi"); 
     b.setVisible(true); 
     b.setSize(500, 500); 


     b.setLocation(500, 200); 
     b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+0

* «есть ошибка в первой фигурной скобкой ... Я, вероятно, отсутствует что-то простое» * Да. Это была бы трассировка стека или ошибка компиляции. Это и то, что мы не смотрим на ваш монитор или психику. –

ответ

3

Вы забыли предоставить реализации для other two methods из KeyListener. Если вы не хотите этого делать, добавьте KeyAdapter вместо KeyListener. KeyAdapter предоставляет пустые реализации всех методов KeyListener, поэтому вы можете выбрать, какие из них реализовать.

3

С KeyListener является interface, ваш внутренний класс должен переопределить все методы, которые были объявлены в интерфейсе. Интерфейс определяет следующие методы:

public interface KeyListener extends EventListener { 

    /** 
    * Invoked when a key has been typed. 
    * See the class description for {@link KeyEvent} for a definition of 
    * a key typed event. 
    */ 
    public void keyTyped(KeyEvent e); 

    /** 
    * Invoked when a key has been pressed. 
    * See the class description for {@link KeyEvent} for a definition of 
    * a key pressed event. 
    */ 
    public void keyPressed(KeyEvent e); 

    /** 
    * Invoked when a key has been released. 
    * See the class description for {@link KeyEvent} for a definition of 
    * a key released event. 
    */ 
    public void keyReleased(KeyEvent e); 
} 

Лучший способ заключается в использовании класса KeyAdapterabstract адаптера для приема событий клавиатуры. Здесь вы можете преодолеть любые конкретные method, которые вы хотите, и не все.

Кроме того, поскольку вы новичок в JavaSwing, следующие ссылки могут пригодиться:

И о, я заметил, что у Вас есть метод void Klistener в классе с именем Klistener. Я предполагаю, что вы пытаетесь сделать constructor, а не как метод. Если это так, тогда поймите, что у constructors нет никакого типа возврата! Вот yet another link, который может помочь.

+0

'KeyListener' имеет три метода: – Jeffrey

+0

@Jeffrey: О да, мой плохой :) Спасибо за исправление – Sujay

2

У вас так много ошибок, так что я даже не знаю, должны были начать:

1) KeyListener представляет собой интерфейс, так что вы должны реализовать все метода.

2) Не добавляйте KeyListener к панели, добавьте ее в ваш JFrame. Вы можете сделать это путем создания класса анонимного или таким образом

public class Klistener extends JFrame implements KeyListener{} 

3) Не вызывать setSize() метод, вызовите pack() и setPreferredSize() метод и после этого setVisible(true), и вызвать их в конце коды.

Это как ваш главный метод должен выглядеть:

public static void main(String[] args){ 
    Klistener k = new Klistener(); 
    k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    k.setLocationByPlatform(true); 
    k.setPreferredSize(new Dimension(400,300)); 
    k.pack(); 
    k.setVisible(true); 

    } 
1

У вас есть какие-то ошибки там. Вот рабочий код (Минимальное изменение):

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
public class Klistener extends JFrame { 
public Klistener() 
{ 
    JPanel c = new JPanel(); 
    c.setFocusTraversalKeysEnabled(true);  
    addKeyListener(new KeyListener() 
    { 


     @Override 
     public void keyTyped(KeyEvent e){} 

     @Override 
     public void keyPressed(KeyEvent e) { 
      if(e.getKeyCode()==KeyEvent.VK_DOWN)     
         System.out.println("hi"); 
     } 

     @Override 
     public void keyReleased(KeyEvent e){} 

    }); 

} 
public static void main(String[] args) 
{ 
    Klistener a = new Klistener(); 
    a.setSize(500, 500); 
    a.setLocation(500, 200); 
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    a.setVisible(true); 

} 
} 
+0

Почему setVisible() перед всем остальным и почему setSize(); Все остальное очень хорошо. –

+0

Взято из исходного кода, не задумываясь ... плохо отредактировал (спасибо) –

+3

Поскольку вы редактируете. 1) Не расширяйте рамку, сохраняйте ссылку на нее. 2) добавьте некоторые компоненты (например, 'JTree') в фрейм и' pack() ', а не' setSize() '3) вызовите' setLoctionByPlatform (true) 'вместо того, чтобы явно устанавливать позицию. 4) Используйте 'setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);' 5) Запустите/обновите GUI на EDT. 6) Ключевые привязки .. –