События Key Listener не запускаются? - PullRequest
0 голосов
/ 18 июня 2011

Я хочу иметь возможность зарегистрировать событие нажатия клавиши, которое запускает логическую переменную.Я сделал это в своем основном классе, но теперь я пытаюсь поместить его в классы, и, похоже, он не работает.

Вот класс героев:

public class Hero extends Main {
private boolean downPressed;
private boolean leftPressed;
private boolean rightPressed;

public void init() {
}

public void paint(Graphics g, int x_pos, int y_pos) {

    if (isDownPressed() && isLeftPressed()) {
        this.sprite = hero225;
    } else if (isDownPressed() && isRightPressed()) {
        this.sprite = hero135;
    } else if (isUpPressed() && isRightPressed()) {
        this.sprite = hero45;
    } else if (isUpPressed() && isLeftPressed()) {
        this.sprite = hero315;
    } else if (isLeftPressed() == true) {
        this.sprite = hero270;
    } else if (isRightPressed() == true) {
        this.sprite = hero90;
    } else if (isUpPressed() == true) {
        this.sprite = hero;
        System.out.println("Succsess");
    } else if (isDownPressed() == true) {
        this.sprite = hero180;
    }

    // this.sprite will contain value set on last "movement"
    g.drawImage(this.sprite, x_pos, y_pos, this);
}

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        setLeftPressed(true);
        System.out.println("keyPressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        setRightPressed(true);

    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        setUpPressed(true);
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        setDownPressed(true);
    }

}

public void keyReleased(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        setLeftPressed(false);
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

        setRightPressed(false);
    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        setUpPressed(false);

    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        setDownPressed(false);
    }
}

public void keyTyped(KeyEvent e) {

}

public void mouseClicked(MouseEvent e) {
    System.out.println("HIT!");

}

public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

public void mousePressed(MouseEvent e) {
    boolean isButtonPressed = true;

}

public void mouseReleased(MouseEvent e) {
    boolean isButtonPressed = false;

}


public void setDownPressed(boolean downPressed) {
    this.downPressed = downPressed;
}

public boolean isDownPressed() {
    return downPressed;
}

public void setLeftPressed(boolean leftPressed) {
    this.leftPressed = leftPressed;
}

public boolean isLeftPressed() {
    return leftPressed;
}

public void setRightPressed(boolean rightPressed) {
    this.rightPressed = rightPressed;
}

public boolean isRightPressed() {
    return rightPressed;
}

public void setUpPressed(boolean upPressed) {
    this.upPressed = upPressed;
}

public boolean isUpPressed() {
    return upPressed;
}

И вот класс уровня, который вызывает его:

public class Level extends Main {
Hero hero = new Hero();

public void paint(KeyEvent e, Graphics g, double x_pos, double x_pos2) {
    repaint();
}

А вот функция Paint в классе Main, которая вызывает это:

public void paint(Graphics g) {
    Level level = new Level();
    level.paint(e, g, x_pos, y_pos);

Проблема, вызывающая это, не 'кажется очевидным.

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Вы должны реализовать интерфейс java.awt.event.KeyListener в классе (ах), который вы хотите прослушивать для событий, в данном случае Hero, так:

public class Hero extends Main implements java.awt.event.KeyListener

, а затем зарегистрироваться для событий в каком-либо методе,может быть init или где-то еще, используя:

addKeyListener(this);
//rest of your code

Или, если вы хотите прослушивать только некоторые события, вы можете вместо реализации интерфейса KeyListener зарегистрировать адаптер:

addKeyListener(new java.awt.KeyAdapter()
{
   public void keyPressed(java.awt.KeyEvent e)
   {
       //handle just this event
   }
}
);
//rest of of your code
1 голос
/ 18 июня 2011

Похоже, проблема фокуса: только активный компонент получит KeyEvents.

Существует несколько способов решения этой проблемы, но я обнаружил, что этот учебник довольно хорошо описывает идеи.Но если вы хотите быстрое и грязное (грязное? Не уверенное, легкое и простое - не плохо, я бы подумал; просто немного раздутый для больших проектов) решение, вы можете просто реализовать слушатель для каждого компонента и переслать события внекоторый общий класс, который обрабатывает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...