当前位置: 首页 > 知识库问答 >
问题:

在JavaFX中,如何在网格的每个单元格中输入鼠标上的GridPane行和列ID?

戎鹏云
2023-03-14

我正在我的应用程序中试用JFX拖放特性(稍后以一个序列连接对象)。我找不到任何简单的方法拖放我的ImageView/按钮在我的窗格的适当位置,因此我计划应用GridPane的使用。GridPane将是一个包含超过(50x50)个单元格的大画布。

如果我在代码中指定需要通过ImageView在(2,2)单元格处拖放,我就能够做到这一点。但是,我需要给我的用户这个访问权限。用户可以在网格中移动指针,并将ImageView/按钮放在网格中的任何单元格上。

现在,我想找出在GridPane的特定单元格中输入的鼠标上的单元格的rowID和columnID。

我在控制器中处理鼠标事件如下:

package sample;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable{
Stage stage;

@FXML
private GridPane gridPane;

public void setStage(Stage primaryStage){
    stage = primaryStage;
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    System.out.println("initialize");
}


@FXML
private void handleMouseEntered(MouseEvent event){
    System.out.println("MouseEntered");
}

}

在gridpane中输入时,我只得到一次“mouseEnter”。此外,我无法获得任何RowID和ColumnID,因此,我没有在函数中编写任何函数。

我想知道两件事:

[]如何在GridPane的每个单元格中检测鼠标进入?

[]如何找出特定单元格的行和列ID?

提前道谢。

共有1个答案

桓喜
2023-03-14

您可以通过调用GridPane.GetColumnIndex(node)GridPane.GetRowIndex(node)来获取值。

您还没有展示在网格窗格中放入了什么,甚至是用FXML还是Java填充它,但这里有一些基本功能。在这里,我(冗长地)用FXML填充GridPane。根据您的用例,用Java填充可能更好(即在控制器中)。(这样,处理程序也变得更干净了。)

控制器类:

import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;


public class GridPaneTrackingController {

    @FXML
    private void mouseEntered(MouseEvent e) {
        Node source = (Node)e.getSource() ;
        Integer colIndex = GridPane.getColumnIndex(source);
        Integer rowIndex = GridPane.getRowIndex(source);
        System.out.printf("Mouse entered cell [%d, %d]%n", colIndex.intValue(), rowIndex.intValue());
    }
}

如果您不想在FXML中定义单元格的内容,那么您可以只在控制器中定义它们。这使得事情变得更简单,因为您可以在定义监听器时注册它们:

import javafx.fxml.FXML;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;


public class GridPaneTrackingController {

    @FXML
    private GridPane grid ;

    public void initialize() {
        int numCols = 4 ;
        int numRows = 4 ;

        for (int i = 0 ; i < numCols ; i++) {
            ColumnConstraints colConstraints = new ColumnConstraints();
            colConstraints.setHgrow(Priority.SOMETIMES);
            grid.getColumnConstraints().add(colConstraints);
        }

        for (int i = 0 ; i < numRows ; i++) {
            RowConstraints rowConstraints = new RowConstraints();
            rowConstraints.setVgrow(Priority.SOMETIMES);
            grid.getRowConstraints().add(rowConstraints);
        }

        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);
    }

}

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.GridPane?>

<GridPane xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="GridPaneTrackingController" 
    fx:id="grid" gridLinesVisible="true">

</GridPane>

应用:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class GridPaneTrackingExample extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane root = FXMLLoader.load(getClass().getResource("GridPaneTrackingExample.fxml"));
        primaryStage.setScene(new Scene(root, 800, 800));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 好吧,如上所述,我在我的javafx应用程序中有网格窗格,并且我试图获取它,以便当我将鼠标悬停在单个单元格上时,鼠标所在的单元格将变为黄色(认为excel有点东西)。我不知道如何做到这一点,然后在鼠标离开手机后重置它。 这就是我现在拥有它的方式,但它只是在鼠标悬停时改变一种颜色,然后保持该颜色。整个表格也不会更改每个单元格。有人帮忙吗?

  • 我有一个GridPane,如下所示: 我想通过代码合并网格中心的3列,但我找不到这样做的方法。有一个如何通过场景构建器实现这个的参考,但是我不用场景构建器。 有人知道如何合并它们吗?

  • 我想找到获得单元格中许多元素的列和行索引的最佳解决方案。 比如我有GridPane(15x15)。每个单元格都有按钮组件。当mouseClicked事件被指示时,我想获取行和列的索引。我知道如何手动操作: 但我的问题是:15x15网格窗格。声明每个按钮并为每个组件复制相同的代码是无效的。有人知道怎么做吗? //============================================

  • 我有一个学校项目或类似的东西,我试图为用户制作一个注册面板。当用户点击注册时,这个面板会打开。它看起来像这样。 我想做的是禁用创建按钮,只有在对话框上有3个检查时才会启用。 我在对话框上使用GridPane,我在考虑返回这些单元格上的某些节点(检查是图像视图),并检查条件是否为真。然而,我不知道如何从GridPane返回节点。如果你有其他方法来解决这个问题,也没关系。 这是代码的相关部分。

  • 我正在创建一个应用程序,在一个gridPane的每个单元格内随机显示圆形(不同颜色)。 我想做的是创建一个“shuffle”按钮,在gridPane中随机改变每个圆的位置。然而,我不断遇到一大堆问题。 这是我到目前为止所拥有的。我的两个类(没有添加XML文件): 控制器类 主类

  • 问题内容: 目标:从所有行内的定位标记中提取文本并将其放入csv中。 我正在尝试以下代码: 它工作正常,但csv中的每个单元格仅包含一个字符。 像这样: 代替: 我当然想念什么。但是呢 问题答案: 接受一个序列。您只给它一个字符串,因此将其视为一个序列,字符串的作用类似于字符序列。 您还要在此行中还有什么?没有?如果是这样,请使其成为一项的列表: (顺便说一句,由于您已经加入了Unicode分隔符