showMessageDialog影响KeyHandler

时间:2015-05-06 08:50:23

标签: java swing netbeans

我的KeyHandler在这里:

private void KeyHandler(java.awt.event.KeyEvent evt) {                            
        // TODO add your handling code here:

        if(evt.getKeyCode() == KeyEvent.VK_UP)
        {
            if(menuPosition == 1){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_3.png")));
                menuPosition = 3;
            }
            else if(menuPosition == 2){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png")));
                menuPosition = 1;
            }
            else if(menuPosition == 3){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_2.png")));
                menuPosition = 2;
            }
        }
        if(evt.getKeyCode() == KeyEvent.VK_DOWN)
        {
            if(menuPosition == 1){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_2.png")));
                menuPosition = 2;
            }
            else if(menuPosition == 2){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_3.png")));
                menuPosition = 3;
            }
            else if(menuPosition == 3){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png")));
                menuPosition = 1;
            }
        }
        if(evt.getKeyCode() == KeyEvent.VK_ENTER)
        {
            if(menuPosition == 1){
                menuPosition = 5;
                Container parent = MenuLabel.getParent();
                parent.removeAll();
                parent.add(NewGamePanel);
                parent.repaint();
                parent.revalidate();

            }
            else if(menuPosition == 2){
                menuPosition = 4;
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/readme.png")));
            }
            else if(menuPosition == 3){
                System.exit(0);
            }
            else if(menuPosition == 4){
                MenuLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/labyrinth grafika/menu/menu_volba_1.png")));
                menuPosition = 1;
            }
        }
    } 

我也有我的按钮:

private void backButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:

        jPanel1.removeAll();
        jPanel1.add(MenuLabel);
        jPanel1.repaint();
        jPanel1.revalidate();
        menuPosition = 1;


    }  

当JPanel1是我的程序的Panel时。我在那里有CardLayout,当点击这个按钮时,我想关闭所有内容,然后回到我的MenuLabel。

在Java生成的initComponents中有以下代码:

// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    MenuLabel = new javax.swing.JLabel();
    NewGamePanel = new javax.swing.JPanel();
    NewGameHeader = new javax.swing.JLabel();
    NewGameBody = new javax.swing.JPanel();
    sizeOfField = new javax.swing.JComboBox();
    sizeOfFieldLabel = new javax.swing.JLabel();
    NewGameOkButton = new javax.swing.JButton();
    jLabel1 = new javax.swing.JLabel();
    numberOfPlayersCombo = new javax.swing.JComboBox();
    backButton = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Labyrinth - The Game");
    setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
    setMinimumSize(new java.awt.Dimension(1000, 650));
    setPreferredSize(new java.awt.Dimension(650, 700));
    setResizable(false);
    setSize(new java.awt.Dimension(650, 700));
    addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            KeyHandler(evt);
        }
    });
    ...

有趣的是,单击按钮后我的KeyHandler无效,但是当我将这个简单的代码放入backButtonActionPerformed函数时:

JOptionPane.showMessageDialog(null, null);

keyHandler再次正常工作。任何人都可以告诉我为什么会这样,如何在不弹出消息对话框的情况下让KeyHandler再次工作?

其余代码由Java(其他一些盒子等)生成。

谢谢。

2 个答案:

答案 0 :(得分:1)

不要使用KeyListener s,他们注册的组件需要具有键盘焦点并且可以集中精力

相反,请使用旨在克服这些限制的Key Bindings API

请参阅How to use Key Bindings

答案 1 :(得分:1)

在您的函数backButtonActionPerformed(java.awt.event.ActionEvent evt)中尝试添加一行

jPanel1.requestFocusInWindow();
在行menuPosition = 1;之前

并尝试运行该程序。