[英]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");
}
我要去哪里錯了? 任何幫助將不勝感激。
因此,基於此...
} 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.