我正在製作一個遊戲,玩家試圖在迷宮中導航,但是我遇到了兩個讓我絕對難倒的bug。我的第一個問題是使用setContentPane()
。每當我將它設置爲我的預期背景時,它都會覆蓋屏幕上的其他所有內容。我試圖將它重新安置到我認爲可能的每個地方,但它仍然覆蓋了它。我的第二個問題是關於我的JButton
。每當我點擊它時,它會根據預期改變播放速度,但我不能在之後移動。它在我的Keylistener中使用該方法時有效,並且它們內部具有相同的代碼。我已經包含了我認爲必要的所有代碼,但如果您需要更多,請告訴我。該項目的完整源代碼可以在Here找到。setContentPane覆蓋所有東西,JButton不能正常工作
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;
public class Game extends JPanel implements ActionListener, KeyListener {
private boolean upPressed = false;
private boolean downPressed = false;
private boolean rightPressed = false;
private boolean leftPressed = false;
private int tileSize = 200;
private int playerSize = tileSize/4;
private int playerSpeed = playerSize/10;
private int mazeX = 51;
private int mazeY = 51;
private int[][] maze = new int[mazeX][mazeY];
private int[][] initX = new int[mazeX][mazeY];
private int[][] initY = new int[mazeX][mazeY];
private boolean[][] visited = new boolean[mazeX][mazeY];
private int currentCellX = 0;
private int currentCellY = 0;
private int deltaX = 0;
private int deltaY = 0;
JComponent background = new JLabel(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png")));
JButton adventure = new JButton();
JButton freePlay = new JButton();
JButton exit = new JButton();
JButton pause = new JButton();
JButton resume = new JButton();
private String screen = "menu";
public Main main;
public Game(Main main) {
this.main = main;
setFocusable(true);
addKeyListener(this);
addButtons();
setUpInitialCoordinates();
Timer timer = new Timer(1000/120, this);
timer.start();
}
private void tick() {
switch (screen) {
case "playing" :
background.setVisible(false);
if (upPressed) {
deltaY += playerSpeed;
} else if (downPressed) {
deltaY -= playerSpeed;
}
if (rightPressed) {
deltaX -= playerSpeed;
} else if (leftPressed) {
deltaX += playerSpeed;
}
break;
case "paused":
background.setVisible(false);
adventure.setVisible(false);
freePlay.setVisible(false);
pause.setVisible(false);
exit.setVisible(true);
break;
case "menu":
main.setContentPane(new JLabel(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png"))));
adventure.setVisible(true);
freePlay.setVisible(true);
pause.setVisible(false);
exit.setVisible(true);
break;
}
repaint();
}
private void addButtons() {
setLayout(null);
add(freePlay);
freePlay.setBounds(10, 100, 180, 80);
freePlay.setSize(180, 80);
freePlay.setAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
downPressed = false;
rightPressed = false;
leftPressed = false;
generateMaze();
screen = "playing";
}
});
freePlay.setIcon(new ImageIcon(Main.class.getResource("/assets/ui/buttons/freePlayUnselected.png")));
freePlay.setRolloverIcon(new ImageIcon(Main.class.getResource("/assets/ui/buttons/freePlaySelected.png")));
}
private void setUpInitialCoordinates() {
}
private void generateMaze() {
}
private boolean checkForUnvisitedCells() {
}
private boolean checkForUnvisitedAdjacentCells() {
}
@Override
public void actionPerformed(ActionEvent e) {
tick();
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void paintComponent(Graphics g) {
}
}
確切地說,你是什麼'setContentPane'呢?也許你應該看看[如何使用根窗格](https://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) – MadProgrammer
*「我的第二個問題是關於我的JButton。每當我點擊它,它會根據預期改變到播放速度,但是我不能在之後移動。當我在我的Keylistener中使用該方法時,它就起作用了。「* - 歡迎來到爲什麼你不應該使用KeyListener的奇妙世界,按鈕已盜取鍵盤焦點並且「KeyListener」將不再響應鍵盤輸入,因爲它依賴於它所註冊的可聚焦和聚焦的組件。改爲使用鍵綁定。 [如何使用鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer
@MadProgrammer keyListener是工作的方法,JButton的一半工作,但阻止了我移動。至於'setContentPane()'我的朋友告訴我如何爲JFrame設置背景。 – jklsfdgs