Отключить выбор кнопки JavaFX - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь создать редактор спрайтов с использованием JavaFX с использованием кнопок в качестве пикселей. Я могу изменить цвет каждой кнопки при нажатии, но я пытаюсь получить его, чтобы при нажатии и перетаскивании я мог рисовать несколько пикселей.

Проблема, которую я нахожу, заключается в том, что после нажатия и удержания кнопки я не могу выбрать новую кнопку, когда наведу указатель мыши на новую кнопку, чтобы выбрать и ее. Если я нажму и перетаскиваю, повторно введя эту кнопку, я могу получить отладочное сообщение «Paint Dragged Pixel», но не если я введу новый пиксель с помощью мыши вниз, чего я и хочу. Также я могу получить кнопку пикселя для печати «Введенного пикселя», когда мышь вводит какую-либо кнопку, но не для нажатия и перетаскивания на новый пиксель.

Мне кажется, проблема в том, что когда я нажимаю на один пиксель, я блокируюсь и не могу выбрать новый пиксель, наводя курсор на новый. Есть ли способ отменить это выделение или проблема в другом.

Основное применение:

public class Main extends Application {


boolean mousePressed = false;
public boolean isMousePressed() {
    return 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++) {
            PixelButton button = new PixelButton();
            button.setParentMain(this);

            button.setOnMousePressed(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    mousePressed = true;
                    System.out.println("mouseDown");
                }
            });

            button.setOnMouseReleased(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    mousePressed = false;
                    System.out.println("mouseUp");
                }
            });

            gridPane.add(button, x, y);
        }
    }

    root.getChildren().add(gridPane);

    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}

}

Класс для PixelButton.

public class PixelButton extends Button {

Main parentMain;
public void setParentMain(Main parent) {
    parentMain = parent;
}

public PixelButton() {

    this.setMinSize(10, 10);
    this.setPrefSize(10, 10);

    this.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {

        }
    });
    this.setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("Entered Pixel");

            if(parentMain.isMousePressed()){
                System.out.println("Paint Dragged Pixel");
            }
        }
    });
}

}

Заранее спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Хорошо, поэтому я немного подумал об этом и, наконец, нашел решение. Я немного упростил свое решение и использовал вместо кнопок прямоугольники, но вы также можете перенести большую часть кода на кнопки, чтобы Начнем с того, что это не та функциональность, которую вы искали, но настолько близко, насколько это возможно, я запускаю событие при нажатии мыши, которое освобождает щелчок мыши и до тех пор, пока это событие не приходит из прямоугольника, тогда не переворачиваем булеву картину рисовать, и поэтому вы в основном нажимаете, чтобы войти в «Режим рисования», и нажимаете снова, чтобы выйти из раскрашивания плиток

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); }
}
...