触发ActionListener之后,如何更新Gridlayout
我正在尝试建立一个包含一个播放器(红色正方形)的网格,该网格可以使用WASD键在网格周围移动。到目前为止,我的ActionListener正在注册按键,但是在呼叫网格(面板)上的RepAlt()方法时,都没有任何更改。如何使董事会更新?
这是我的主要课程:
public class game {
public static void main(String[] args) {
JFrame GUI = new GUI();
GUI.setVisible(true);
}
}
这是我的自定义Jframe:
public class GUI extends JFrame implements KeyListener {
//JPanel board = new board();
public board board;
public GUI() {
super();
board = new board();
add(board);
//setSize(800, 800);
//setVisible(true);
pack();
addKeyListener(this);
repaint();
}
@Override
public void repaint() {
super.repaint();
}
@Override
public void keyPressed(KeyEvent e) {
board.keyPressed(e);
board.repaint();
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) { }
}
这是我的自定义JPanel类,它使用Jlabels构造网格:
public class board extends JPanel {
public static final int GRID_SIZE = 20;
int playerX = ThreadLocalRandom.current().nextInt(0, GRID_SIZE + 1);
int playerY = ThreadLocalRandom.current().nextInt(0, GRID_SIZE + 1);
public board() {
//JPanel panel = new JPanel();
int row = GRID_SIZE;
int col = GRID_SIZE;
setBounds(100, 100, 500, 500);
setLayout(new GridLayout(col, row));
JLabel[][] grid= new JLabel[col][row];
for (int y = 0; y < col; y++){
for (int x = 0; x < row; x++){
grid[x][y] = new JLabel();
grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black));
grid[x][y].setBackground(Color.white);
grid[x][y].setOpaque(true);
add(grid[x][y]);
}
}
grid[playerX][playerY].setBackground(Color.red);
}
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
switch (k) {
case KeyEvent.VK_D:
playerX++;
break;
case KeyEvent.VK_A:
playerX--;
break;
case KeyEvent.VK_W:
playerY--;
break;
case KeyEvent.VK_S:
playerY++;
break;
}
}
}
I am trying to build a grid containing a player (red square) that can move around the grid using the WASD keys. So far my actionlistener is registering key pressed, however when calling the repaint() method on the grid (panel), nothing changes. How can I get the board to update?
Here is my Main class:
public class game {
public static void main(String[] args) {
JFrame GUI = new GUI();
GUI.setVisible(true);
}
}
Here is my custom JFrame:
public class GUI extends JFrame implements KeyListener {
//JPanel board = new board();
public board board;
public GUI() {
super();
board = new board();
add(board);
//setSize(800, 800);
//setVisible(true);
pack();
addKeyListener(this);
repaint();
}
@Override
public void repaint() {
super.repaint();
}
@Override
public void keyPressed(KeyEvent e) {
board.keyPressed(e);
board.repaint();
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) { }
}
Here is my custom JPanel class that constructs the grid using JLabels:
public class board extends JPanel {
public static final int GRID_SIZE = 20;
int playerX = ThreadLocalRandom.current().nextInt(0, GRID_SIZE + 1);
int playerY = ThreadLocalRandom.current().nextInt(0, GRID_SIZE + 1);
public board() {
//JPanel panel = new JPanel();
int row = GRID_SIZE;
int col = GRID_SIZE;
setBounds(100, 100, 500, 500);
setLayout(new GridLayout(col, row));
JLabel[][] grid= new JLabel[col][row];
for (int y = 0; y < col; y++){
for (int x = 0; x < row; x++){
grid[x][y] = new JLabel();
grid[x][y].setBorder(BorderFactory.createLineBorder(Color.black));
grid[x][y].setBackground(Color.white);
grid[x][y].setOpaque(true);
add(grid[x][y]);
}
}
grid[playerX][playerY].setBackground(Color.red);
}
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
switch (k) {
case KeyEvent.VK_D:
playerX++;
break;
case KeyEvent.VK_A:
playerX--;
break;
case KeyEvent.VK_W:
playerY--;
break;
case KeyEvent.VK_S:
playerY++;
break;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须更新回调中的背景。
You have to update the background in your callback.