如何在JavaFX的GridPane外围添加数织(Nonogram)游戏的线索提示边栏
实现方案
你可以通过两种常用方式实现线索边栏的添加,以下是可直接落地的修改逻辑:
方案1:嵌套布局实现(逻辑更清晰,易维护)
不改动现有棋盘GridPane的代码,在外层套BorderPane容器分别承载不同区域:
- 顶部区域放列线索(对应每一列的提示数字)
- 左侧区域放行线索(对应每一行的提示数字)
- 中心区域放你已经实现的棋盘网格
你可以在现有render()方法的循环代码后补充以下逻辑:
// 1. 构建列线索容器:GridPane列数和棋盘一致,每列宽度和棋盘格子同宽30px GridPane colCluePane = new GridPane(); for (int col = 0; col < w; col++) { // 替换为从model中取对应列的线索列表 List<Integer> colClues = model.getColClues(col); for (int k = 0; k < colClues.size(); k++) { Label clueLabel = new Label(colClues.get(k).toString()); clueLabel.setPrefSize(width, width); clueLabel.setAlignment(Pos.CENTER); // 线索是从下往上排列,所以行索引倒序计算 colCluePane.add(clueLabel, col, colClues.size() - 1 -k); } } // 2. 构建行线索容器:GridPane行数和棋盘一致,每行高度和棋盘格子同高30px GridPane rowCluePane = new GridPane(); for (int row = 0; row < h; row++) { // 替换为从model中取对应行的线索列表 List<Integer> rowClues = model.getRowClues(row); for (int k = 0; k < rowClues.size(); k++) { Label clueLabel = new Label(rowClues.get(k).toString()); clueLabel.setPrefSize(width, width); clueLabel.setAlignment(Pos.CENTER); // 线索是从右往左排列,所以列索引倒序计算 rowCluePane.add(clueLabel, rowClues.size() - 1 -k, row); } } // 3. 外层BorderPane组装所有区域 BorderPane root = new BorderPane(); root.setCenter(board); root.setTop(colCluePane); root.setLeft(rowCluePane); // 调整边距避免元素贴边 root.setPadding(new Insets(20)); // 最后返回root而不是原来的board return root;
方案2:扩展现有GridPane实现(对齐更方便,无需额外适配)
直接给现有棋盘GridPane拓展第0行、第0列的位置存放线索,原有棋盘格子的索引偏移1位即可:
- 原有添加棋盘格子的代码
board.add(rec[i][j], i, j);修改为board.add(rec[i][j], i+1, j+1); - 第0行的第
i+1列位置放对应列的线索,第0列的第j+1行位置放对应行的线索
该方案不需要额外处理线索和棋盘的对齐问题,天然和格子一一对应。
注意事项
- 线索Label的宽高统一设置为和棋盘格子一致的30px,可保证列/行完全对齐
- 数织常规会每5格加一条粗分隔线,你可以在添加矩形/Label时判断索引是否为5的倍数,调整对应边的stroke宽度实现
内容的提问来源于stack exchange,提问作者URTHEGOD
相关产品推荐
相关产品推荐

