Хорошо, поэтому я немного подумал об этом и, наконец, нашел решение. Я немного упростил свое решение и использовал вместо кнопок прямоугольники, но вы также можете перенести большую часть кода на кнопки, чтобы Начнем с того, что это не та функциональность, которую вы искали, но настолько близко, насколько это возможно, я запускаю событие при нажатии мыши, которое освобождает щелчок мыши и до тех пор, пока это событие не приходит из прямоугольника, тогда не переворачиваем булеву картину рисовать, и поэтому вы в основном нажимаете, чтобы войти в «Режим рисования», и нажимаете снова, чтобы выйти из раскрашивания плиток
public class Main extends Application {
private boolean mousePressed;
@Override
public void start(Stage primaryStage) throws Exception{
BorderPane borderPane = new BorderPane();
primaryStage.setTitle("SpriteSheet");
Group root = new Group();
Scene scene = new Scene(borderPane, 500,200);
// scene.setFill(Color.BLACK);
primaryStage.setScene(scene);
GridPane gridPane = new GridPane();
borderPane.setCenter(root);
for(int x = 0; x < 10; x++) {
for(int y = 0; y < 10; y++) {
Rectangle rectangle = new Rectangle(10, 10);
rectangle.setOnMousePressed(event -> {
mousePressed = true;
System.out.println("mouseDown");
rectangle.fireEvent(new MouseEvent(MouseEvent.MOUSE_RELEASED,
rectangle.getLayoutX(), rectangle.getLayoutY(), rectangle.getLayoutX(), rectangle.getLayoutY(),
MouseButton.PRIMARY, 1,
false, false, false, false,
false, false, false, false,
false, false, null));
});
rectangle.setOnMouseReleased(event -> {
System.out.println(event.getSource());
if(!event.getSource().toString().equals("Rectangle[x=0.0, y=0.0, width=10.0, height=10.0, fill=0x000000ff]")) {
mousePressed = false;
System.out.println("mouseUp");
}
});
rectangle.setOnMouseMoved(event -> {
if(mousePressed) {
rectangle.setFill(Color.BLUE);
}
});
gridPane.add(rectangle, x, y);
}
}
root.getChildren().add(gridPane);
primaryStage.show();
}
public static void main(String[] args) { launch(args); }
}