从一个GridPane中删除AnchorPane并将其添加到另一个GridPane会导致它偏移

时间:2015-04-17 23:28:18

标签: java user-interface javafx-8

我正在JavaFX中编写Scrabble GUI。我的董事会'和我的瓷砖架#39;都是GridPanes。董事会的每个索引都包含一个AnchorPane的扩展名(称为SquareWithBorder),以及' tiles'当用户将磁贴放在板上时,会将(称为LetterTileWithValue)添加到此处。结果是一个GridPane,包含AnchorPanes,其中一些包含Tiles(我的tile也是AnchorPane扩展)。对于上下文,我的tile模型是Tile类。

我的问题是,当我将瓷砖AnchorPane从机架GridPane移动到电路板GridPane时,瓷砖会向右偏移。瓷砖偏移的距离取决于瓷砖在机架中的位置。机架第一个位置的磁贴将出现在我单击的方框中的板上。机架第二个位置的平铺将略微偏移,第三个位置的平铺将略微更多偏移等。如果我将所有平铺放入机架的第一个索引GridPane然后当我将它们移动到Board中时,所有的tile都将具有相同的偏移量。偏移量与瓷砖在机架中的位置直接相关。

下面是截图,希望能够证明这一点。

The red lines show where the first two tiles were placed on the board. The 1st tile ('f') was placed in the top left, and each subsequent tile was placed below the others.

将瓷砖从机架移动到电路板是通过onMouseClicked事件处理程序和连接到ObservableLists的监听器实现的,这些监视器为电路板和机架建模。以下是一些代码段。

public void addTileToRack(Tile t) {
    LetterTileWithValue tempTile = new LetterTileWithValue(t.getToken(), t.getValue());
    tempTile.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            mainApp.setSelectedTile(tempTile);
            tempTile.setSelected();
        }

    });
    rack.addRow(0, tempTile);
}

将tile对象添加到mainApp类中的模型时,将调用此方法。它位于屏幕截图中视图的控制器类中。

public void setMainApp(MainApp mainApp) {
    this.mainApp = mainApp;

    for(int i = 0; i < (15*15); i++) {
        SquareWithBorder tempSquare = new SquareWithBorder(i);
        tempSquare.setMainApp(this.mainApp);
        tempSquare.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                LetterTileWithValue selectedTile = mainApp
                        .getSelectedTile();
                if (selectedTile != null) {
                    selectedTile.setRow(tempSquare.getIndex() / 15);
                    selectedTile.setCol(tempSquare.getIndex() % 15);
                    tempSquare.setTile(selectedTile);
                    move.put(selectedTile.getLetter(),
                            tempSquare.getIndex());
                    mainApp.clearSelectedTile();
                }
            }

        });
        board.add(tempSquare, i % 15, i / 15);
    }
}

此方法也在游戏视图的控制器类中。

public void setTile(LetterTileWithValue tile) {
    if (tile != null) {
        ObservableList<Node> children = this.getChildren();
        tile.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if(!tile.isFinalMove()) {
                    System.out.printf("[DEBUG - SWB setTile] Letter: %s\n",  
                            tile.getLetter());
                    mainApp.addToRack(new Tile(tile.getLetter()));
                    children.remove(tile);
                }
            }

        });
        children.add(tile);
    }
}

此方法位于SquareWithBorder类中,并在选择其中一个机架磁贴时单击Square时调用。

0 个答案:

没有答案