Forum zamknięte. Zapraszamy do grupy na Facebooku
Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
KeyListener - brak reakcji na wciśnięty klawisz
02-10-2013, 02:30 PM
Post: #1
Question KeyListener - brak reakcji na wciśnięty klawisz
Witam!

Otóż mam następujący problem - słuchacz KeyListener nie reaguje na kliknięty klawisz. Najprościej będzie, gdy wstapię odpowiednie kody:

Klasa główna:
Kod:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gierka;

import java.awt.EventQueue;

/**
*
* @author Abc
*/
public class Gierka {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame(800,600);
            }
        });
    }
}

Klasa Frame:
Kod:
import java.awt.BorderLayout;
import javax.swing.JFrame;

/**
*
* @author Abc
*/
public class Frame extends JFrame{    
    int width;
    int height;
    public Frame(int width, int height){
        super("Gierka");
        this.width=width;
        this.height=height;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(width, height);
        setLocation(0, 0);
        setLayout(new BorderLayout(1,1));
        MyButton button1 = new MyButton("Przycisk 1");
        add(button1, BorderLayout.PAGE_START);
        Panel panel = new Panel(300,200);
        panel.addListener();
        add(panel, BorderLayout.CENTER);
        setVisible(true);
    }
    
}

Klasa MyButton:
Kod:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

/**
*
* @author Abc
*/
class MyButton extends JButton implements ActionListener{
    int liczba;
    public MyButton(String string){
        super(string);
        this.liczba=0;
        addActionListener(this);
    }
    @Override
    public void actionPerformed(ActionEvent e){
        Object source=e.getSource();
        if (source == this){
            liczba++;
            if (liczba%2==0){
                setBackground(Color.green);
                setText("Gra rozpoczeta!");
            }
            else{
                setBackground(Color.red);
                setText("Gra przerwana!");
            }
        }
    }
}

Klasa Panel:
Kod:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

/**
*
* @author Abc
*/
public class Panel extends JPanel implements KeyListener {
    int x, y;
    public Panel(int x, int y){
        this.x=x;
        this.y=y;
        this.setPreferredSize(new Dimension(200, 200));
        this.setForeground(Color.red);
    }
    
    void changeXY(int x, int y){
        this.x=x; this.y=y;
    }
    public void addListener(){
        addKeyListener(this);
    }
    
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D graphics2D = (Graphics2D) g;
        Rectangle2D rectangle = new Rectangle2D.Double(300,200,180,180);
        graphics2D.draw(rectangle);
        

        x--; y--;
        Rectangle2D rectangleSecond = new Rectangle2D.Double(x,y,10,10);
        graphics2D.draw(rectangleSecond);
    }
    
    @Override
    public void keyPressed(KeyEvent event){
       if (event.getKeyChar()=='a'){
            setBackground(Color.red);
        }
    }
    @Override
    public void keyReleased(KeyEvent event){
        if (event.getKeyChar()=='a'){
            setBackground(Color.red);
        }
    }    
    @Override
    public void keyTyped(KeyEvent event){
    }
}

I w tej klasie występuje owo działanie, a raczej jego brak. Zgodnie z sugestią z komentarzy z odpowiedniego działu strony, słuchacz jest dodawany do klasy rozszerzającej JPanel. Zgodnie z moją intencją, naciśnięcie i zwolnenie klawisza 'a' powinno zmieniać kolor tła, niestety nie obserwuję reakcji. Dobrze działa za to słuchacz przy przycisku, który swój kolor jak i napis zmienia.
Zaczynam dopiero swoją przygodę z Javą, skutkiem czego mogę nie zauważać banalnego dla Was błędu - wdzięczny będę za pomoc w zlokalizowaniu go.

Z góry dziękuję,
Pneumokok.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
05-03-2013, 05:14 PM
Post: #2
RE: KeyListener - brak reakcji na wciśnięty klawisz
Wydaje mi się, że KeyListener i paintComponent nie powinny być w jednej klasie. Spróbuj przenieść KeyListener do Frame. Problematyczny jest też MyButton - wszystko zadziała kiedy dasz do dodatkowo jako komentarz, więc prawdopodobnie trzeba mu przydzielić dodatkowy wątek.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości