2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
GridPane
您可以通過(guò)遍歷子節(jié)點(diǎn)來(lái)獲取對(duì)節(jié)點(diǎn)的引用GridPane
。
添加一些簡(jiǎn)單的計(jì)算來(lái)找到被點(diǎn)擊的兩個(gè)按鈕之間的對(duì)角線,如果有的話:
import java.awt.Toolkit;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class FxMain extends Application {
? ? private static final int COLS = 5, ROWS = 5;
? ? private int clickCounter = 0;
? ? private GridPane grid;
? ? private Button first, second;
? ? @Override
? ? public void start(Stage primaryStage){
? ? ? ? VBox root = new VBox(10);
? ? ? ? root.setPadding(new Insets(10));
? ? ? ? root.getChildren().addAll(makeGrid(),?
? ? ? ? ? ? ? ? new Text("Click 2 buttons to find the \n diagonally between them"));
? ? ? ? primaryStage.setScene(new Scene(root));
? ? ? ? primaryStage.sizeToScene();
? ? ? ? primaryStage.show();
? ? }
? ? private Pane makeGrid() {
? ? ? ? grid = new GridPane();
? ? ? ? for(int rowIndex = 0; rowIndex < ROWS ; rowIndex++) {
? ? ? ? ? ? //an array to hold buttons of one row
? ? ? ? ? ? Node[] nodes = new Node[COLS];
? ? ? ? ? ? for(int colIndex = 0; colIndex < COLS ; colIndex++) {
? ? ? ? ? ? ? ? Button node= new Button(rowIndex+""+colIndex);
? ? ? ? ? ? ? ? node.setOnAction(e->buttonCliked(node)); //add action listener
? ? ? ? ? ? ? ? nodes[colIndex]= node;
? ? ? ? ? ? }
? ? ? ? ? ? grid.addRow(rowIndex, nodes);
? ? ? ? }
? ? ? ? return grid;
? ? }
? ? private void buttonCliked(Button button) {
? ? ? ? if(clickCounter == 0){
? ? ? ? ? ? first = button;
? ? ? ? }else{
? ? ? ? ? ? second = button;
? ? ? ? ? ? markNode(findMidDiagonalButton());
? ? ? ? }
? ? ? ? System.out.println(clickCounter + " " + button.getText()? ? );
? ? ? ? clickCounter=? ++clickCounter %2 ;? // changes values between 0 1
? ? }
? ? //change node background for a short while, and then reset it
? ? private void markNode(Node node) {
? ? ? ? if(node == null) return;
? ? ? ? String style = node.getStyle();
? ? ? ? node.setStyle("-fx-background-color: cornflowerblue;");
? ? ? ? PauseTransition pause = new PauseTransition(Duration.seconds(1));
? ? ? ? pause.play();
? ? ? ? pause.setOnFinished(e-> node.setStyle(style));
? ? }
? ? private Node findMidDiagonalButton() {
? ? ? ? int rowDelta = GridPane.getRowIndex(first) - GridPane.getRowIndex(second);
? ? ? ? int colDelta = GridPane.getColumnIndex(first) - GridPane.getColumnIndex(second);
? ? ? ? if( Math.abs(rowDelta) != 2 ||? Math.abs(colDelta) != 2 ){
? ? ? ? ? ? Toolkit.getDefaultToolkit().beep();
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? int rowsSum = GridPane.getRowIndex(first) + GridPane.getRowIndex(second);
? ? ? ? int colsSum = GridPane.getColumnIndex(first) + GridPane.getColumnIndex(second);
? ? ? ? return? getNodeByRowCol(Math.abs(rowsSum / 2), Math.abs(colsSum / 2) );
? ? }
? ? public Node getNodeByRowCol (int row, int col) {
? ? ? ? for (Node node : grid.getChildren()) {
? ? ? ? ? ? if(GridPane.getRowIndex(node) == row && GridPane.getColumnIndex(node) == col)
? ? ? ? ? ? ? ? return node;
? ? ? ? }
? ? ? ? return null;
? ? }
? ? public static void main(final String[] args) {
? ? ? ? launch(args);
? ? }
}

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
所以這是可能的,我從這篇文章中找到了答案。他只要自己想辦法,就能找到具體的位置。?javafx GridPane 檢索特定單元格內(nèi)容
private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
for (Node node : gridPane.getChildren()) {
? ? if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
? ? ? ? return node;
? ? }
}
return null;
}
雖然,為了我自己的目的,我仍然需要弄清楚如何能夠測(cè)試節(jié)點(diǎn)是否包含“紅色”或“黑色”,所以我只是添加了這個(gè),現(xiàn)在一切正常!
private Boolean getNodeFromGridPane(GridPane gridPane, int col, int row) {
? ? for (Node node : gridPane.getChildren()) {
? ? ? ? if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
? ? ? ? ? ? if (node.toString().contains("black")) {
? ? ? ? ? ? ? ? System.out.println("The second button is black = " + node.toString().contains("black"));
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? ? ? if (node.toString().contains("red")) {
? ? ? ? ? ? ? ? System.out.println("The second button is red = " + node.toString().contains("red"));
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return false;
}
添加回答
舉報(bào)