未调用java keylistener
我已经用Java中的未调用java keylistener,java,swing,keylistener,key-bindings,Java,Swing,Keylistener,Key Bindings,我已经用Java中的KeyListener编写了一个示例代码, 我创建了一个JPanel,然后将其focusable设置为true,我创建了一个KeyListener,请求了一个焦点,然后将KeyListener添加到我的面板中。但是从来没有调用keyListener的方法。虽然我要求集中注意力,但似乎没有集中注意力 有人能帮忙吗 listener = new KeyLis(); this.setFocusable(true); this.requestFocus(); this.addKeyL
KeyListener
编写了一个示例代码,
我创建了一个JPanel
,然后将其focusable设置为true,我创建了一个KeyListener,请求了一个焦点,然后将KeyListener添加到我的面板中。但是从来没有调用keyListener的方法。虽然我要求集中注意力,但似乎没有集中注意力
有人能帮忙吗
listener = new KeyLis();
this.setFocusable(true);
this.requestFocus();
this.addKeyListener(listener);
class KeyLis implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
currentver += 5;
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5;
break;
case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5;
break;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
}
}
如果需要任何可运行代码:
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class test extends JFrame {
private AreaOfGame areaOfGame;
public test()
{
super("");
setVisible(true);
this.setBackground(Color.darkGray);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
setLayout(null);
setBounds(200, 10, 400, 700);
areaOfGame = new AreaOfGame();
this.add(areaOfGame);
startGame();
}
public int generateNext()
{
Random r = new Random();
int n = r.nextInt(7);
return n;
}
public void startGame()
{
while(!areaOfGame.GameOver())
{
areaOfGame.startGame(generateNext());
}
}
public static void main(String[] args) {
new MainFrame();
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JPanel;
public class AreaOfGame extends JPanel {
private static final int rightside = 370;
private int bottom;
private int top;
private int currentPos;
private int currentver;
private KeyLis listener;
public AreaOfGame()
{
super();
bottom = 650;
top = 50;
setLayout(null);
setBounds(20, 50, 350, 600);
setVisible(true);
this.setBackground(Color.lightGray);
listener = new KeyLis();
this.setFocusable(true);
if(this.requestFocus(true))
System.out.println("true");;
this.addKeyListener(listener);
currentPos = 150;
currentver=0;
}
public void startGame(int n)
{
while(verticallyInBound()){
System.out.println("anything");
}
}
public boolean verticallyInBound()
{
if(currentPos<= bottom -50)
return true;
return false;
}
public boolean GameOver()
{
if(top>= bottom){
System.out.println("game over");
return true;
}
else return false;
}
public boolean horizontalyInBounds()
{
if(currentPos<=rightside && currentPos>= 20)
return true;
else return false;
}
class KeyLis implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
System.out.println("called");
currentver += 5;
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5; break;
case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5; break;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("called 3");
}
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公共类测试扩展了JFrame{
私人比赛场地;
公开考试()
{
超级(“”);
setVisible(真);
这个.挫折背景(颜色.暗灰色);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个包();
setLayout(空);
立根(200,10400700);
areaOfGame=新areaOfGame();
添加(游戏区域);
startGame();
}
public int generateNext()
{
随机r=新随机();
int n=r.nextInt(7);
返回n;
}
公共无效StartName()
{
而(!areaOfGame.GameOver())
{
name.startName(generateNext())的区域;
}
}
公共静态void main(字符串[]args){
新主机();
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JPanel;
名称的公共类区域扩展了JPanel{
专用静态最终int右侧=370;
私有int底部;
私人int top;
私人国际邮政局;
私人内勤;
私钥监听器;
公共区域名称()
{
超级();
底部=650;
top=50;
setLayout(空);
立根(20,50,350,600);
setVisible(真);
本图为背景色(颜色:浅灰色);
listener=newkeylis();
此参数为.setFocusable(true);
if(this.requestFocus(true))
System.out.println(“true”);;
this.addKeyListener(listener);
currentPos=150;
currentver=0;
}
公共无效起始名称(内部n)
{
while(verticallyinbund()){
System.out.println(“任何”);
}
}
公共布尔VerticallyinBind()
{
如果(当前位置=底部){
System.out.println(“游戏结束”);
返回true;
}
否则返回false;
}
公共布尔水平边界()
{
如果(当前位置=20)
返回true;
否则返回false;
}
类KeyLis实现KeyListener{
@凌驾
按下公共无效键(按键事件e){
System.out.println(“被调用”);
currentver+=5;
开关(如getKeyCode()){
case KeyEvent.VK_LEFT:if(horizontalyInBounds())currentPos-=5;break;
case KeyEvent.VK_RIGHT:if(horizontalyInBounds())currentPos+=5;break;
}
重新油漆();
}
@凌驾
公共无效密钥已释放(密钥事件e){
//TODO自动生成的方法存根
}
@凌驾
public void keyTyped(KeyEvent e){
System.out.println(“称为3”);
}
}
}
我敢打赌,您是在JPanel呈现之前(在顶级窗口调用了pack()
或setVisible(true)
之前)请求焦点的,如果是这样,这将不起作用。焦点请求可能只有在呈现组件后才会被授予。您是否检查了对requestFocus()
的调用返回的内容?它必须返回true,您的调用才有可能成功。此外,最好使用requestFocusInWindow()
而不是requestFocus()
但更重要的是,您不应该为此使用键侦听器,而应该使用键绑定,这是Swing本身用来响应按键的更高级别的概念
编辑一个示例: 编辑2
以及使用键绑定的等效项:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class TestKeyBindings extends JPanel {
public TestKeyBindings() {
add(new JButton("Foo")); // something to draw off focus
setKeyBindings();
}
private void setKeyBindings() {
ActionMap actionMap = getActionMap();
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = getInputMap(condition );
String vkLeft = "VK_LEFT";
String vkRight = "VK_RIGHT";
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), vkLeft);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), vkRight);
actionMap.put(vkLeft, new KeyAction(vkLeft));
actionMap.put(vkRight, new KeyAction(vkRight));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
private class KeyAction extends AbstractAction {
public KeyAction(String actionCommand) {
putValue(ACTION_COMMAND_KEY, actionCommand);
}
@Override
public void actionPerformed(ActionEvent actionEvt) {
System.out.println(actionEvt.getActionCommand() + " pressed");
}
}
private static void createAndShowGui() {
TestKeyBindings mainPanel = new TestKeyBindings();
JFrame frame = new JFrame("TestKeyListener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
编辑3关于最近的SSCCE,您的
while(true)
循环正在阻塞Swing事件线程,可能会阻止用户交互或绘制。最好使用Swing计时器,而不是while(true)
。例如:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class BbbTest extends JFrame {
private AreaOfGame areaOfGame;
public BbbTest() {
super("");
// setVisible(true);
this.setBackground(Color.darkGray);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
setLayout(null);
setBounds(200, 10, 400, 700);
areaOfGame = new AreaOfGame();
this.add(areaOfGame);
setVisible(true);
startGame();
}
public int generateNext() {
Random r = new Random();
int n = r.nextInt(7);
return n;
}
public void startGame() {
// while (!areaOfGame.GameOver()) {
// areaOfGame.startGame(generateNext());
// }
areaOfGame.startGame(generateNext());
}
public static void main(String[] args) {
new BbbTest();
}
class AreaOfGame extends JPanel {
private static final int rightside = 370;
private int bottom;
private int top;
private int currentPos;
private int currentver;
private KeyLis listener;
public AreaOfGame() {
super();
bottom = 650;
top = 50;
setLayout(null);
setBounds(20, 50, 350, 600);
setVisible(true);
this.setBackground(Color.lightGray);
listener = new KeyLis();
this.setFocusable(true);
if (this.requestFocus(true))
System.out.println("true");
;
this.addKeyListener(listener);
currentPos = 150;
currentver = 0;
}
public void startGame(int n) {
// while (verticallyInBound()) {
// System.out.println("anything");
// }
int timeDelay = 50; // msecs delay
new Timer(timeDelay , new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println("anything");
}
}).start();
}
public boolean verticallyInBound() {
if (currentPos <= bottom - 50)
return true;
return false;
}
public boolean GameOver() {
if (top >= bottom) {
System.out.println("game over");
return true;
}
else
return false;
}
public boolean horizontalyInBounds() {
if (currentPos <= rightside && currentPos >= 20)
return true;
else
return false;
}
class KeyLis implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("called");
currentver += 5;
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
if (horizontalyInBounds())
currentPos -= 5;
break;
case KeyEvent.VK_RIGHT:
if (horizontalyInBounds())
currentPos += 5;
break;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("called 3");
}
}
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.Random;
导入javax.swing.*;
公共类BbbTest扩展了JFrame{
私人比赛场地;
公共BBB测试(){
超级(“”);
//setVisible(真);
这个.挫折背景(颜色.暗灰色);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个包();
setLayout(空);
立根(200,10400700);
areaOfGame=新areaOfGame();
添加(游戏区域);
setVisible(真);
startGame();
}
public int generateNext(){
随机r=新随机();
int n=r.nextInt(7);
返回n;
}
公共无效StartName(){
//而(!areaOfGame.GameOver()){
//name.startName(generateNext())的区域;
// }
name.startName(generateNext())的区域;
}
公共静态void main(字符串[]args){
新BbbTest();
}
类AreaOfGame扩展了JPanel{
专用静态最终int右侧=370;
私有int底部;
私人int top;
私人国际邮政局;
私人内勤;
私钥监听器;
公共区域名称(){
超级();
底部=650;
top=50;
setLayout(空);
立根(20,50,350,600);
setVisible(真);
本图为背景色(颜色:浅灰色);
listener=newkeylis();
此参数为.setFocusable(true);
if(this.requestFocus(true))
System.out.println(“真”);
;
T
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class BbbTest extends JFrame {
private AreaOfGame areaOfGame;
public BbbTest() {
super("");
// setVisible(true);
this.setBackground(Color.darkGray);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
setLayout(null);
setBounds(200, 10, 400, 700);
areaOfGame = new AreaOfGame();
this.add(areaOfGame);
setVisible(true);
startGame();
}
public int generateNext() {
Random r = new Random();
int n = r.nextInt(7);
return n;
}
public void startGame() {
// while (!areaOfGame.GameOver()) {
// areaOfGame.startGame(generateNext());
// }
areaOfGame.startGame(generateNext());
}
public static void main(String[] args) {
new BbbTest();
}
class AreaOfGame extends JPanel {
private static final int rightside = 370;
private int bottom;
private int top;
private int currentPos;
private int currentver;
private KeyLis listener;
public AreaOfGame() {
super();
bottom = 650;
top = 50;
setLayout(null);
setBounds(20, 50, 350, 600);
setVisible(true);
this.setBackground(Color.lightGray);
listener = new KeyLis();
this.setFocusable(true);
if (this.requestFocus(true))
System.out.println("true");
;
this.addKeyListener(listener);
currentPos = 150;
currentver = 0;
}
public void startGame(int n) {
// while (verticallyInBound()) {
// System.out.println("anything");
// }
int timeDelay = 50; // msecs delay
new Timer(timeDelay , new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println("anything");
}
}).start();
}
public boolean verticallyInBound() {
if (currentPos <= bottom - 50)
return true;
return false;
}
public boolean GameOver() {
if (top >= bottom) {
System.out.println("game over");
return true;
}
else
return false;
}
public boolean horizontalyInBounds() {
if (currentPos <= rightside && currentPos >= 20)
return true;
else
return false;
}
class KeyLis implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("called");
currentver += 5;
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
if (horizontalyInBounds())
currentPos -= 5;
break;
case KeyEvent.VK_RIGHT:
if (horizontalyInBounds())
currentPos += 5;
break;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("called 3");
}
}
}
}