java keylistener导出后无法正常工作

时间:2011-04-26 10:00:10

标签: java applet keylistener

我有一个托管我的Applet的JFrame。 applet上有一个KeyListener来处理箭头键和enter / escape键。

当我在Eclipse中运行我的JFrame时,一切正常,箭头键以及输入和转义键都会响应。

但是,当我将项目导出到可执行Jar文件时...箭头键仍然有效,但输入和转义键不起作用。我该如何解决这个问题?

主类中的代码:

public static void main(String[] args) throws Exception {
    new SnakeApp().snake();
}

public void snake() throws Exception {
    // Set windows look
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    // Create window
    JFrame window = new JFrame("FinalSnake");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Add FinalSnake applet
    FinalSnake finalSnake = new FinalSnake();
    finalSnake.init();
    finalSnake.start();
    window.add(finalSnake);

    // Set size
    window.setResizable(false);
    window.getContentPane().setPreferredSize(new Dimension(FinalSnake.GRIDSIZE * FinalSnake.GRIDX, FinalSnake.GRIDSIZE * FinalSnake.GRIDY));
    window.pack();

    // Set Icon
    window.setIconImage(new ImageIcon(this.getClass().getResource("gfx/icon.png")).getImage());

    // Center the frame
    Dimension frameSize = Toolkit.getDefaultToolkit().getScreenSize();
    window.setLocation((frameSize.width - window.getSize().width) / 2, (frameSize.height - window.getSize().height) / 2);

    // Show the window
    window.setVisible(true);

    // And focus the FinalSnake applet
    finalSnake.requestFocusInWindow();
}

FinalSnake Applet中的代码:

@Override
public void keyPressed(KeyEvent e) {
    if (this.world == null) {
        if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_LEFT) {
            this.gameType--;

            if (this.gameType == 0) {
                this.gameType = 2;
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_RIGHT) {
            this.gameType++;

            if (this.gameType == 3) {
                this.gameType = 1;
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
            this.world = new World(this.gameType);
        }
    } else {
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
            this.world = null;
        }
    }
}

希望有人能为我解决这个问题...... Thnx

1 个答案:

答案 0 :(得分:0)

您可以尝试在KeyEvent变量上使用consume()方法。它说:

  

消耗此事件以便它   不以默认方式处理   源于它的来源。

这会覆盖我猜的默认方式。

public void keyPressed(KeyEvent e) {
//Do your actions
e.consume();
}