我正在JavaFX中编写Scrabble GUI。我的董事会'和我的瓷砖架#39;都是GridPanes。董事会的每个索引都包含一个AnchorPane的扩展名(称为SquareWithBorder),以及' tiles'当用户将磁贴放在板上时,会将(称为LetterTileWithValue)添加到此处。结果是一个GridPane,包含AnchorPanes,其中一些包含Tiles(我的tile也是AnchorPane扩展)。对于上下文,我的tile模型是Tile类。
我的问题是,当我将瓷砖AnchorPane从机架GridPane移动到电路板GridPane时,瓷砖会向右偏移。瓷砖偏移的距离取决于瓷砖在机架中的位置。机架第一个位置的磁贴将出现在我单击的方框中的板上。机架第二个位置的平铺将略微偏移,第三个位置的平铺将略微更多偏移等。如果我将所有平铺放入机架的第一个索引GridPane然后当我将它们移动到Board中时,所有的tile都将具有相同的偏移量。偏移量与瓷砖在机架中的位置直接相关。
下面是截图,希望能够证明这一点。
将瓷砖从机架移动到电路板是通过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时调用。