簡體   English   中英

Java Swing中面板上的KeyListener。 輸出錯誤

[英]KeyListener on panel in java Swing. Wrong output

我想使用'w's'a'd'鍵上下移動白框。 這是我的代碼:

static int matrix[][] = { { 1, 1, 1, 1,1,1 }, { 1, 0, 0, 0,0,0 }, { 1, 3, 1, 1,0,0 }, {1,0,1,0,0,0}, {1,0,1,2,2,1}, {1,1,1,1,1,1}  };
JPanel easyPanel(){

    JPanel panel = new JPanel(new GridLayout(6, 6, 0, 0));


    int rowNumber = 0; 
    int colNumber = 0; 


    for (int i = 0; i < 36; i++) {
        if(colNumber == 6){
            colNumber = 0;
            rowNumber++; 
        }
        JLabel l = new JLabel();


        if(matrix[rowNumber][colNumber] == 0){
                l.setBackground(Color.pink);
            }
        else if(matrix[rowNumber][colNumber]==2){
            l.setIcon(new ImageIcon(new ImageIcon("cross.png").getImage().getScaledInstance(70, 70, Image.SCALE_DEFAULT)));


        }

else if(matrix[rowNumber][colNumber]==3){
                l.setIcon(new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(70, 70, Image.SCALE_DEFAULT)));
                int row = rowNumber;
                int col = colNumber;
                addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent ke) {
                    //move();
                }
                @Override
                public void keyReleased(KeyEvent ke) {
                    //move();.
                }
                @Override
                public void keyTyped(KeyEvent ke) {
                    panel.setVisible(false);
                    matrix[row][col] = 0;
                    move(ke,row,col);
                }
            });
            }




   private void move(KeyEvent ke,int row,int col){
        if(ke.getKeyChar() == 'w'){
            System.out.println("Pressed up");
            matrix[row-1][col] = 3;
            JPanel newGame = easyPanel(); 
            newGame.setVisible(true);
            add(newGame); 

        }
        else if(ke.getKeyChar() =='s'){
            System.out.println("Pressed down");
            matrix[row+1][col] = 3;
            JPanel newGame = easyPanel(); 
            newGame.setVisible(true);
            add(newGame);
        }
        else if(ke.getKeyChar() == 'a'){
            System.out.println("Pressed left");
            matrix[row][col-1] = 3;
            JPanel newGame = easyPanel(); 
            newGame.setVisible(true);
            add(newGame);
        }
        else if(ke.getKeyChar() == 'd'){
            System.out.println("Pressed right");
            matrix[row][col+1] = 3;
            JPanel newGame = easyPanel(); 
            newGame.setVisible(true);
            add(newGame);
        }
        else
            System.out.println("Invalid Input");
    }

但是我得到這樣的輸出:默認: 在此處輸入圖片說明

先動'w'-正確: 在此處輸入圖片說明

下一步'd'-安裝一個塊,它使兩個塊變成白色: 在此處輸入圖片說明

我要去哪里錯了? 任何幫助將不勝感激。

因此,基於此...

} else if (matrix[rowNumber][colNumber] == 3) {
    l.setIcon(new ImageIcon(new ImageIcon("icon.png").getImage().getScaledInstance(70, 70, Image.SCALE_DEFAULT)));
    int row = rowNumber;
    int col = colNumber;
    addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent ke) {
            //move();
        }

        @Override
        public void keyReleased(KeyEvent ke) {
            //move();.
        }

        @Override
        public void keyTyped(KeyEvent ke) {
            panel.setVisible(false);
            matrix[row][col] = 0;
            move(ke, row, col);
        }
    });
}

每次調用easyPanel並在矩陣中找到3時,都會添加一個新的KeyListener ,假設您正確地更新了矩陣,這意味着第一次調用該矩陣時,您要注冊一個KeyListener ,然后在下次調用easyPanel ,則添加另一個,依此類推。

KeyListener應該單獨注冊,並且只能注冊一次。 實際上,我強烈建議您在KeyListener使用鍵綁定API ,因為它將解決與焦點相關的問題

我還會考慮其他更新模型。 不必每次都重新創建UI,只需創建另一個JLabel矩陣,該matrix首先基於matrix值創建。

然后,您可以更新matrix

matrix[row][col] = 0;

然后更新標簽

updateUI(row, col);

可以做...

switch (matrix[row][col]) {
    case 0: labels[row][col].setIcon(null);
            break;  
    case 2: labels[row][col].setIcon(crossIcon);  
            break;  
    case 3: labels[row][col].setIcon(playerIcon);  
            break;  
}
repaint();

這將減少開銷,並減少閃爍的風險。

您還應該預先緩存並重新使用圖標

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM