触发ActionListener之后,如何更新Gridlayout

发布于 2025-01-25 19:16:38 字数 2413 浏览 3 评论 0原文

我正在尝试建立一个包含一个播放器(红色正方形)的网格,该网格可以使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无力看清 2025-02-01 19:16:38

您必须更新回调中的背景。

public void keyPressed(KeyEvent e) {
    int k = e.getKeyCode();
    grid[playerX][playerY].setBackground(Color.WHITE); 
    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;
    }
    grid[playerX][playerY].setBackground(Color.red);
}

You have to update the background in your callback.

public void keyPressed(KeyEvent e) {
    int k = e.getKeyCode();
    grid[playerX][playerY].setBackground(Color.WHITE); 
    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;
    }
    grid[playerX][playerY].setBackground(Color.red);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文