Мне нужно получить индекс объекта 2D-массива в Java - PullRequest
0 голосов
/ 02 марта 2020

У меня есть 81 объект кнопки 2d массива в Java. (JavaFX) (9 кнопок каждая HBox)

HBox[] hb = new HBox[9];
Button[][] btn = new Button[9][9];

// A for loop in another for loop to create 2d button arrays.
for (int i = 0; i < hb.length; i++) {
    hb[i] = new HBox();
    for (int j = 0; j < btn.length; j++) {
        btn[i][j] = new Button();
        btn[i][j].setText(Integer.toString(i) + "/" + Integer.toString(j));

        btn[i][j].setOnAction(event -> {
            System.out.println(event.getSource()); // In this line I want to print out the 2d array index values of a clicked button
        });

        hb[i].getChildren().add(btn[i][j]);
    }

    mvb.getChildren().add(hb[i]);
}

Как получить значения индекса при нажатии кнопки?

Например, когда я нажимаю btn[5][2] Мне нужно два значения 5 и 2, а не Button@277fbcb4[styleClass=button]'5/3'.

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Лучшим способом было бы создать пользовательский класс кнопки, который расширяет Button и содержит эти значения в качестве переменных экземпляра.

public void addButtons(Pane parentPane) {
    HBox[] hb = new HBox[9];
    Button[][] btn = new Button[9][9];
    // A for loop in another for loop to create 2d button arrays.

    for (int i = 0; i < hb.length; i++) {
        hb[i] = new HBox();
        for (int j = 0; j < btn.length; j++) {
            btn[i][j] = new CustomButton(i, j);

            hb[i].getChildren().add(btn[i][j]);
        }

        parentPane.getChildren().add(hb[i]);
    }
}

class CustomButton extends Button {
    private int i;
    private int j;

    public CustomButton(int i, int j) {
        super();
        this.i = i;
        this.j = j;

        setText(i + "/" + j);

        setOnAction(event -> {
            System.out.println(getI() + " " + getJ());
        });
    }

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }
}
1 голос
/ 02 марта 2020

Для этого можно использовать методы пользовательских данных getUserData/setUserData, установить значение при создании кнопки и затем получить доступ к нему при нажатии кнопки

  for (int i = 0; i < buttons.length; i++) {
    for (int j = 0; j < buttons[i].length; j++) {
      String data = String.format("%d:%d", i, j); //or some similar format
      Button button = new Button();
      //set up button...
      button.setUserData(data);
      buttons[i][j] = button;
   }
  }
...