2013-10-14 3 views
0

Как говорится в заголовке, я пытаюсь добавить ключевой список в JPanel. Пока единственный способ, которым я работал, - добавить пустое текстовое поле и нажать на него. Теперь я не хочу пустое текстовое поле в своей JPanel, поэтому я хочу добавить keylistener в панель.KeyListener в JPanel не работает (панель сфокусирована)

Вот класс, я говорю:

package cookieClicker; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseListener; 

import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class CookieView extends JPanel 
{ 
    private CookieModel cm; 
    private ImageIcon cookie; 
    public Rectangle rect; 

    public CookieView(CookieModel cm) 
    { 
     this.cm = cm; 
     this.setFocusable(true); 
     this.requestFocusInWindow(); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     cookie = new ImageIcon("Untitled-1.png"); 
     g.setColor(Color.ORANGE); 
     g.drawImage(cookie.getImage(), this.getWidth()/2 - 100, this.getHeight()/2 - 100, 200, 200, this); 
     rect = new Rectangle(this.getWidth()/2 - 100, this.getHeight()/2 - 100, 200, 200); 
    } 

    public void addListener(MouseListener m, KeyListener k) 
    { 
     this.addMouseListener(m); 
     this.addKeyListener(k); 
    } 
} 

Кто-нибудь знает, как сделать эту работу?

+0

http://stackoverflow.com/questions/11487369/jpanel-doesnt-respone-to-keylistener-event. проверьте этот linl – Raghunandan

ответ

4

панель сфокусирована

Как вы знаете, панель ориентирована?

Метод requestFocusInWindow() работает только тогда, когда фрейм уже виден во время вызова метода. Поэтому вызов метода в вашем конструкторе ничего не сделает.

Основной код должен быть:

CookieView panel = new CookieView(); 

JFrame frame = new JFrame(); 
frame.add(panel); 
frame.pack(); 
frame.setVisible(true); 
panel.requestFocusInWindow(); 

Кроме того, вы должны убедиться, что весь код выполнить на событие диспетчерской темы.

Однако, вероятно, вы даже не должны использовать KeyListener. В большинстве случаев Swing был разработан для использования с Key Bindings. Прочтите учебник, чтобы узнать, будут ли привязки клавиш работать на вас.

Наконец, вы НЕ должны читать файл изображения в методе paintComponent(). Методы рисования называются всякий раз, когда Swing определяет, что компонент должен быть перекрашен, поэтому неэффективно продолжать чтение изображения снова и снова.

+0

Спасибо, он сумел заставить его работать сейчас. – RemcoW

Смежные вопросы