当前位置: 首页 > 知识库问答 >
问题:

JavaFX-在GridPane中单击可打印出窗格,而不是文本字段

盖玉石
2023-03-14

我想用JavaFX做一个数独游戏。我使用GridPane和TextField制作了9x9网格。

现在,当用户在文本字段中单击时,我想更改文本字段的背景色。为了检查是否一切正常,我正在撬动鼠标事件的目标。

我的问题是,当我在文本字段的中心单击时,目标是窗格,当我在其他地方单击时,目标是我的网格窗格,背景颜色正在改变。

我该怎么办?我不知道怎么做!

public class SudokuGrid {

public static final int GRID_SIZE = 9;

private TextField[][] sudokuCells;
private GridPane sudokuGrid;

public SudokuGrid () {
    sudokuCells = new TextField[GRID_SIZE][GRID_SIZE];
    createSudokuGrid();
    for (int row = 0; row < GRID_SIZE; row++) {
        for(int col = 0; col < GRID_SIZE; col++) {
            sudokuCells[row][col] = new TextField() {
                  @Override
                    public void replaceText(int start, int end, String text) {
                        // If the replaced text would end up being invalid, then simply
                        // ignore this call!
                        if (text.matches("[1-9]|\\s")) {
                            super.setText(text);
                        }
                    }
                };
            sudokuCells[row][col].setPrefSize(60, 60);
            sudokuCells[row][col].setStyle("-fx-background-color: yellow;");
            sudokuGrid.add(sudokuCells[row][col], col, row);
            sudokuGrid.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent e) {
                    Object source = e.getTarget();
                    System.out.println(source);
                    if(source instanceof TextField) {
                        ((TextField) source).setStyle("-fx-background-color: green;");
                    }
                }
                });
        }
    }   
    sudokuGrid.setPrefSize(270, 270); // 30 * 9
    sudokuGrid.setGridLinesVisible(true);
}

private void createSudokuGrid() {
    sudokuGrid = new GridPane();
    for (int i = 0; i  < GRID_SIZE; i++) {
        RowConstraints rc = new RowConstraints();
        rc.setVgrow(Priority.ALWAYS) ; // allow row to grow
        rc.setFillHeight(true); // ask nodes to fill height for row
        // other settings as needed...
        sudokuGrid.getRowConstraints().add(rc);

        ColumnConstraints cc = new ColumnConstraints();
        cc.setHgrow(Priority.ALWAYS) ; // allow column to grow
        cc.setFillWidth(true); // ask nodes to fill space for column
        // other settings as needed...
        sudokuGrid.getColumnConstraints().add(cc);
    }

}

共有1个答案

吕霍英
2023-03-14

事件的是您设置事件过滤器的对象;i、 e.在这种情况下,它是sudokuGrid。那么情况呢

if (source instanceof TextField)

在你的处理程序中永远不会是真的,因为唯一可能的源代码是sudokuGrid。

如果要更改文本字段的背景颜色,可以将事件筛选器添加到文本字段本身:

TextField sudokuCell = sudokuCells[row][col];
sudokuCell.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> 
    sudokuCell.setStyle("-fx-background-color: green;"));

更好的做法是响应文本字段聚焦属性的更改(因为如果用户使用Tab键导航到不同的文本字段,则使用鼠标侦听器不会更改背景):

TextField sudokuCell = sudokuCells[row][col];
sudokuCell.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
    if (isNowFocused) {
        sudokuCell.setStyle("-fx-background-color: green;");
    } else {
        sudokuCell.setStyle("");
    }
});

更好的方法是使用外部css文件来完成此操作:

sudoku-grid.css:

.text-field:focused {
    -fx-background-color: green ;
}

然后在Java代码中将CSS文件与网格关联:

sudokuGrid.getStyleSheets().add("sudoku-grid.css");

并完全移除处理程序。

 类似资料:
  • 我正在使用JavaFX开发一款扫雷游戏: 我的是由组成的,我试图找到一种方法来计算在上单击的图像的列和行索引。我目前有这个代码: 但是,方法和返回。我做错了什么?

  • 如何打印窗格或整个FXML页面。我尝试了这两种方法(doPrint和doPrintSecond在控制器中)进行打印,但不起作用;请纠正我的错误。是否有其他方法可以打印fxml页面或窗格。 FXML代码 控制器代码 这是应用程序,我点击打印按钮,但它不工作。

  • 我们刚刚开始实施NatTable,我们非常高兴看到性能的提高。然而,我们在实现特定功能时遇到了困难。 我们想要的是在单元格中有可点击的文本,然后它将引用我们选择并进入视图的表中的一行。基本上,类似于: 通过单击。

  • 我创建了一个显示图像的JavaFX项目。我在JavaFX中使用画布绘制此图像并将其显示在锚窗格上。我在图像顶部放了一个网格,基本上我需要做的是当用户单击网格中的特定框时,找出单击的位置,以便我可以将坐标存储在文本文件中。 我曾考虑在每个框中放置一个按钮,但这需要一段时间,是否有一种更简单的方法可以使用gridpane实现这一点?如何获得该点击的位置/坐标? 谢谢你!

  • 问题内容: 是否有一种简单的方法可以在Go中格式化字符串而不打印字符串? 我可以: 但是我希望返回格式化的字符串而不是打印出来的字符串,以便我可以进一步处理它。 我也可以做类似的事情: 但这在格式字符串很复杂时很难阅读,而在一个或多个部分不是字符串而必须首先转换的时候(例如, 有没有更简单的方法可以做到这一点? 问题答案: Sprintf是您想要的。 例 您还可以在“ 错误”示例中看到它在使用中,

  • 问题内容: 我想打印任何文本而不在Java中使用system.out.println()吗?如果可以,那么怎么办?任何想法。 问题答案: