Индекс получения Java-FX массива формы при нажатии - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать приложение для боевого корабля.Пока мне удалось отобразить оба поля для игрока и противника.Поле состоит из 10 х 10 прямоугольников - 10 HBox'ов в одном VBox.Это метод, который создает мне поле:

private Rectangle[][] field;    
public VBox CreateField(){
        VBox vbox = new VBox(2);
        for(int i = 0; i < this.columns; ++i){
            HBox hbox = new HBox(2);
            for(int j = 0; j < this.rows; ++j){
                this.array[j][i] = 0;
                this.field[i][j] = new Rectangle(this.height*j, this.width*i, this.height, this.width);
                this.field[i][j].setStroke(Color.BLACK);
                this.field[i][j].setFill(Color.LIGHTGRAY);                
                hbox.getChildren().add(this.field[i][j]);
            }
            vbox.getChildren().add(hbox);
        } 
        return vbox;
    }

Это результат:

enter image description here

Мне нужно получитьИндекс прямоугольника, когда пользователь нажимает один из них.

Ребята, не могли бы вы привести пример / фрагмент кода, как решить мою проблему?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я рекомендую использовать GridPane вместо HBox es и VBox.Вы можете скопировать индексы цикла в final локальные переменные, чтобы получить к ним доступ из анонимного EventHandler выражения класса / лямбды, созданного внутри тела цикла, или вы можете использовать GridPane.getRowIndex / GridPane.getColumnIndex для GridPane children:

public GridPane CreateField(){
    GridPane grid = new GridPane();
    grid.setVgap(2);
    grid.setHgap(2);
    EventHandler<MouseEvent> handler = evt -> {
        Node source = (Node) evt.getSource();
        int row = GridPane.getRowIndex(source);
        int column = GridPane.getColumnIndex(source);
        ...
    };
    for(int i = 0; i < this.columns; i++){
        for(int j = 0; j < this.rows; j++){
            Rectangle rect = new Rectangle(this.height*j, this.width*i, this.height, this.width);
            this.array[j][i] = 0;
            this.field[i][j] = rect;
            rect.setStroke(Color.BLACK);
            rect.setFill(Color.LIGHTGRAY);
            rect.setOnMouseClicked(handler);
            grid.add(rect, j, i);
        }
    } 
    return grid;
}

Вы также можете использовать

final int finalI = i;
final int finalJ = j;
rect.setOnMouseClicked(evt -> {
    // TODO: use finalI and finalJ here 
});

во внутреннем цикле.

0 голосов
/ 27 мая 2018

Lol, получилось быстрее, чем я думал.Вот мое решение ( Как я могу получить индексы каждой кнопки, нажатой для моей программы? )

private EventHandler<? super MouseEvent> createTileHandler(int x, int y) {
    return event -> tileHandler(x, y);
}
private void tileHandler (int x, int y){
    System.out.println(String.format("Clicked tile at (%d,%d)", x, y));
}
public VBox CreateField(){
    VBox vbox = new VBox(2);
    for(int i = 0; i < this.columns; ++i){
        HBox hbox = new HBox(2);
        for(int j = 0; j < this.rows; ++j){
            this.array[j][i] = 0;
            this.field[i][j] = new Rectangle(this.height*j, this.width*i, this.height, this.width);
            this.field[i][j].setStroke(Color.BLACK);
            this.field[i][j].setFill(Color.LIGHTGRAY);      
            this.field[i][j].setOnMouseClicked(createTileHandler(i,j));
            hbox.getChildren().add(this.field[i][j]);
        }
        vbox.getChildren().add(hbox);
    } 
    return vbox;
}

Это возвращает:

Clicked tile at (3,2)
Clicked tile at (3,2)
Clicked tile at (4,4)
Clicked tile at (3,0)
Clicked tile at (8,8)
Clicked tile at (9,9)
Clicked tile at (0,0)
Clicked tile at (0,1)
Clicked tile at (0,2)

Когда я нажимаюодна форма.Извиняюсь за эти вопросы ..

...