关键监听器工作不正常
Posted
技术标签:
【中文标题】关键监听器工作不正常【英文标题】:The Key Listener Is not working properly 【发布时间】:2017-05-17 02:09:07 【问题描述】:我使卡片布局工作完全正常,但现在发生的事情是我向对象角色添加了一个按键监听器,它是一个 JLabel,所以每当人们按下该角色时,该角色应该向上移动,但它绝对什么都不做!
我还尝试用一个按钮替换它,当单击它时它会移动它,它工作得很好。我还尝试更改事件,这意味着我更改了如果他们按下然后城镇地图的图像会改变但仍然没有效果,所以我的 KeyListener 似乎有问题
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings( "unused", "serial" )
public class FinalBlowzXC extends JFrame implements KeyListener
public static JPanel game=new JPanel();
public static JPanel mainmenu=new JPanel(null);
public static JPanel loginpanel=new JPanel(null);
public static JPanel tutorial=new JPanel(null);
public static JPanel registration=new JPanel(null);
public static JPanel town_map=new JPanel(null);
public JTextField username= new JTextField("Username");
public JTextField password=new JTextField("Password");
public JLabel bglogin=new JLabel();
public JLabel character=new JLabel();
public JButton log_in=new JButton();
public JButton register=new JButton();
CardLayout page= new CardLayout();
public String level="";
public int charx=350;
public int chary=435;
public static void main(String []args)
new FinalBlowzXC().setVisible(true);
public FinalBlowzXC()
super("Final Blowz Xchanged");
setSize(640,510);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
game.setLayout(page);
game.add(mainmenu, "1");
game.add(loginpanel, "2");
game.add(tutorial, "3");
game.add(registration, "4");
game.add(town_map, "5");
add(game);
opening();
public void opening()
page.show(game, "1");
JLabel bgmainmenu;
JButton start;
JButton exit;
bgmainmenu = new JLabel();
start = new JButton();
exit = new JButton();
bgmainmenu.setIcon(new ImageIcon(getClass().getResource("/FF-XV.jpg")));
bgmainmenu.setBounds(0,0,640,480);
mainmenu.add(bgmainmenu);
mainmenu.add(start);
start.setBounds(280, 360, 70, 20);
start.setBorder(null);
start.setBorderPainted(false);
start.setContentAreaFilled(false);
start.setOpaque(false);
start.addActionListener(new Start());
exit.setBounds(280, 385, 70, 20);
mainmenu.add(exit);
exit.setBorder(null);
exit.setBorderPainted(false);
exit.setContentAreaFilled(false);
exit.setOpaque(false);
exit.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
System.exit(0);
);
class Start implements ActionListener
public void actionPerformed(ActionEvent e)
login();
public void login()
page.show(game, "2");
bglogin.setIcon(new ImageIcon(getClass().getResource("/FF-XV Login.jpg")));
bglogin.setBounds(0, 0, 640, 480);
username.setBounds(300, 285, 85, 15);
username.setBorder(null);
username.setForeground(Color.WHITE);
username.setOpaque(false);
password.setBounds(300, 310, 85, 20);
password.setBorder(null);
password.setForeground(Color.WHITE);
password.setOpaque(false);
log_in.setBounds(280, 335, 50, 45);
log_in.setBorder(null);
log_in.setBorderPainted(false);
log_in.setContentAreaFilled(false);
log_in.setOpaque(false);
log_in.addActionListener(new Log_in());
register.setBounds(335, 335, 55, 45);
register.setBorder(null);
register.setBorderPainted(false);
register.setContentAreaFilled(false);
register.setOpaque(false);
register.addActionListener(new Register());
loginpanel.add(username);
loginpanel.add(password);
loginpanel.add(bglogin);
loginpanel.add(log_in);
loginpanel.add(register);
class Log_in implements ActionListener
public void actionPerformed(ActionEvent e)
Tutorial();
class Register implements ActionListener
public void actionPerformed(ActionEvent e)
page.show(game, "4");
public void Tutorial()
page.show(game, "3");
JLabel bgtutorial=new JLabel();
JLabel animeforward=new JLabel();
JLabel animeright=new JLabel();
JLabel animeleft=new JLabel();
JButton next=new JButton();
JLabel animebackward=new JLabel();
bgtutorial.setIcon(new ImageIcon(getClass().getResource("/FF-XV Tutorial.jpg")));
bgtutorial.setBounds(0, 0, 640, 480);
animeforward.setIcon(new ImageIcon(getClass().getResource("walkanimofficialfront.gif")));
animeforward.setBounds(115, 230, 30, 30);
animeright.setIcon(new ImageIcon(getClass().getResource("walkanimofficialright.gif")));
animeright.setBounds(190, 315, 30, 30);
animeleft.setIcon(new ImageIcon(getClass().getResource("walkanimofficialleft.gif")));
animeleft.setBounds(45, 315, 30, 30);
animebackward.setIcon(new ImageIcon(getClass().getResource("walkanimofficialback.gif")));
animebackward.setBounds(115, 405, 30, 30);
next.setBounds(530, 430, 100, 30);
next.setBorder(null);
next.setBorderPainted(false);
next.setContentAreaFilled(false);
next.setOpaque(false);
next.addActionListener(new Next());
tutorial.add(next);
tutorial.add(animeright);
tutorial.add(animeleft);
tutorial.add(animebackward);
tutorial.add(animeforward);
tutorial.add(bgtutorial);
class Next implements ActionListener
public void actionPerformed(ActionEvent e)
town();
public void town()
page.show(game, "5");
JLabel map=new JLabel();
map.setIcon(new ImageIcon(getClass().getResource("/FF-XV Town.jpg")));
map.setBounds(0, 0, 640, 480);
character.setIcon(new ImageIcon(getClass().getResource("standfront.png")));
character.setBounds(charx, chary, 30, 35);
town_map.add(character);
town_map.add(map);
public void keyPressed(KeyEvent e)
if(e.getKeyCode()==KeyEvent.VK_UP)
character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialfront.gif")));
character.setLocation(character.getX(), character.getY()+5);
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialright.gif")));
character.setLocation(character.getX()+5, character.getY());
if(e.getKeyCode()==KeyEvent.VK_LEFT)
character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialleft.gif")));
character.setLocation(character.getX()-5, character.getY()+5);
if(e.getKeyCode()==KeyEvent.VK_DOWN)
character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialback.gif")));
character.setLocation(character.getX(), character.getY()-5);
public void keyReleased(KeyEvent e)
public void keyTyped(KeyEvent e)
【问题讨论】:
【参考方案1】:我的 KeyListener 好像有问题
KeyEvent 只为有焦点的组件生成。默认情况下,JLabel 是不可聚焦的,因此它永远不会收到任何事件。
不要使用 KeyListener。
您应该使用Key Bindings
。
有关使用 Key Bindings
的工作示例,请参阅 Motion Using the Keyboard,这正是您想要的。
【讨论】:
我尝试学习但无法理解,而且我没有太多时间,因为它很快就会到期所以有没有办法使用关键监听器通过聚焦来移动标签左右?? @AgentSmith,我给了你使用这两种方法的工作示例。以上是关于关键监听器工作不正常的主要内容,如果未能解决你的问题,请参考以下文章
PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付