【问题标题】:Java Gui Gridlayout: Remove certain object and add another to its positionJava Gui Gridlayout:删除某些对象并将另一个对象添加到其位置
【发布时间】:2017-05-23 02:15:19
【问题描述】:

我正在使用 Java 创建一个赛车游戏,但我在 GUI 部分卡住了。

基本上,在我的游戏中,您投掷骰子,两辆汽车中的一辆相应地从位置 (9,0) 向位置 (0,0) 移动。谁到达(0,0)就是赢家。问题是游戏已经准备就绪,除了移动过程之外,一切都运行良好。我正在使用 GridLayout 向用户展示地图,地图上有 7 种对象:道路、障碍物、加油站、END 瓦片、START 瓦片以及 2 辆汽车。我使用 generate 方法随机生成地图,然后将其传递给 GUI 类,以便它可以完成工作,向用户显示地图。

但是,我不知道如何从地图中删除某些图块,以便向用户显示汽车所在的位置。我使用图像,然后将它们放入标签中。我最初的操作是从网格中删除整个组件并为汽车添加一个新的 ImageIcon。另外,我知道“.setIcon”方法,但我怎么知道要编辑哪个 ImageIcon?

生成方法。

    public void generate(){
    int result;
    int greenCounter = 0;
    int blackCounter = 0;
    for (int i = 0; i < tiles.length; i++){
        for (int j = 0; j < tiles.length; j++){
            result = (int)(Math.random()*23 + 1);
            if (i == 0 && j == 0) tiles[i][j] = new Start();
            else if (i == 9 && j == 0) tiles[i][j] = new End();
            else if (result > 2) tiles[i][j] = new Grey();
            else if (result == 1) {
                blackCounter++;
                if (blackCounter <=6) tiles[i][j] = new Black();
                else tiles[i][j] = new Grey();
            }
            else if (result == 2){
                greenCounter++;
                if (greenCounter <=6) tiles[i][j] = new Green();
                else tiles[i][j] = new Grey();
            }
        }
    }
}

GUI 构造函数中的地图创建:

for(int i = 0; i < tiles.length; i++){
        for(int j = 0; j < tiles.length; j++){
            if(tiles[i][j] instanceof Green) {
                roadGas = new ImageIcon ("road/road_gas.jpg");
                roadGasLb = new JLabel(roadGas);
                tilesPanel.add(roadGasLb);
            }
            else if(tiles[i][j] instanceof Grey){
                road = new ImageIcon ("road/road.jpg");
                roadLb = new JLabel(road);
                tilesPanel.add(roadLb);
            } 
            else if(tiles[i][j] instanceof Black){
                roadObstacle = new ImageIcon("road/road_obstacle.jpg");
                roadObstacleLb = new JLabel(roadObstacle);
                tilesPanel.add(roadObstacleLb);
            } 
            else if (i == 9 && j==0) {
                roadStart = new ImageIcon ("road/roadStart_car.jpg");
                roadStartLb = new JLabel(roadStart);
                tilesPanel.add(roadStartLb);
            }   
            else if (i == 0 && j == 0) {
                roadEnd = new ImageIcon ("road/roadEnd.jpg");
                roadEndLb = new JLabel(roadEnd);
                tilesPanel.add(roadEndLb);
            } 
        }
    }

汽车在地图内移动时应该如何显示。我知道这是行不通的,但我不知道该怎么做。

                carLocation = nissan.getCarLocation();
                int x;
                int y;
                for (int i = 0; i < carLocation.length; i++){
                    for (int j = 0; j < carLocation.length; j++){
                        if (carLocation[i][j] != null){
                            if (tiles[i][j] instanceof Black) tiles[i][j].action(nissan);;
                            if (tiles[i][j] instanceof Grey) tiles[i][j].action(nissan);
                            if (tiles[i][j] instanceof Green) tiles[i][j].action(nissan);
                            x = i;
                            y = j;
                            if (x % 2 == 0){
                                roadCar = new ImageIcon ("road/road_GTR_right.jpg");
                                roadCarLb = new JLabel(roadCar);
                                tilesPanel.add(roadCarLb,x,y);
                                contentPanel.add(tilesPanel, BorderLayout.CENTER);
                            }
                            else {
                                roadCar = new ImageIcon ("road/road_GTR_left.jpg");
                                roadCarLb = new JLabel(roadCar);
                                tilesPanel.add(roadCarLb,x,y);
                                contentPanel.add(tilesPanel, BorderLayout.CENTER);
                            }
                            break;
                        }

How the map looks:

提前致谢,感谢任何回答。

【问题讨论】:

    标签: java user-interface awt


    【解决方案1】:

    但是,我不知道如何从地图中删除某些图块,以便向用户显示汽车所在的位置。

    你不应该使用行/列值来设置组件所在的“网格”。然后您可以使用Containerremove(...)add(...) 方法将组件删除/添加到面板。比如:

    int index = (rowIndex * cellsInRow) + columnIndex.
    panel.remove(index);
    panel.add(component, index);
    panel.revalidate();
    panel.repaint();
    

    或者更简单的方法是使用

    替换标签的图标
    label.setIcon(...) method.
    

    【讨论】:

      【解决方案2】:

      您可以使用 add(Component, index) 在正确的位置添加替换组件。您可以通过在 Container.getComponents() 的结果中找到旧组件来找出正确的索引,或者如果您知道行和列,则只需数学计算

      【讨论】:

        猜你喜欢
        • 2022-11-26
        • 2022-12-08
        • 2021-03-15
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2021-07-14
        • 2021-07-24
        相关资源
        最近更新 更多