分享
为什么问答平台  ›  专栏  ›  技术社区  ›  enir

如何在JavaFX控制器中手动降低对象层? - Way to manually lower an object layer in JavaFX controller?

  •  0
  • enir  · 技术社区  · 6 天前

    我正在尝试创建一个游戏,我需要一些网格窗格的片段来进行单击事件,而有些则不需要。我这样做的方法是手动将窗格作为单击事件添加到主网格窗格中。但这些也涵盖了我的其他一些点击事件。我有一个名为“objclicked”的单独函数,它在单击ImageView时触发。我希望ImageView是窗格单击事件上方的一个层。

    }
    

    我试过在scenebuilder中将imageview移到顶部,但没有用。

       for (int i = 0 ; i < numCols ; i++) {
                for (int j = 0; j < numRows; j++) {
                    addPane(i, j);
                }
            }
        }
    
    
        private void addPane(int colIndex, int rowIndex) {
            Pane pane = new Pane();
            pane.setOnMouseEntered(e -> {
                System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
            });
            grid.add(pane, colIndex, rowIndex);
        }
    

    这包括网格窗格的所有“单元格”,包括ImageView。我希望ImageView仍然可以点击。

    1 回复  |  直到 6 天前
        1
  •  0
  •   fabian    6 天前

    我试过在scenebuilder中将imageview移到顶部

    这是错误的方向。最下面的子项(子项列表中索引最高的子项)绘制在其他子项之上。此外,由于在加载fxml时添加了这些子项,即在 for 循环执行时, GridPane.add 方法在现有元素的基础上添加新元素。

    解决此问题的一种方法是添加 Pane 在子列表的开头。请注意,对于大型 numCols * numRows 你应该重写这个来使用 addAll 用于批量插入节点的方法,因为将节点添加到 ArrayList (子列表的支持列表)重复执行时性能不佳。也许你看不出有什么不同。

    private void addPane(int colIndex, int rowIndex) {
        Pane pane = new Pane();
    
        GridPane.setRowIndex(pane, rowIndex);
        GridPane.setColumnIndex(pane, colIndex);
    
        pane.setOnMouseEntered(e -> {
            System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
        });
    
        grid.getChildren().add(0, pane); // add pane to front of child list
    }