JavaFX: как сделать узлы взаимодействующими в прозрачной сцене? - PullRequest
0 голосов
/ 07 мая 2020

Я пишу программу, в которой я хочу иметь возможность перетаскивать (и выполнять другие взаимодействия) узел вокруг рабочей области, но сцена и сцена прозрачны, поэтому вы можете видеть свой рабочий стол и другие приложения за ним. Это то, что у меня есть в Main, чтобы сделать фон прозрачным:

public class Main extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("scene.fxml"));
    Scene scene = new Scene(root);

    root.setStyle("-fx-background-color: rgba(0,0,0, 0); -fx-border-color: black;");
    scene.setFill(Color.TRANSPARENT);

    stage.setTitle("JavaFX and Gradle");
    stage.setScene(scene);
    stage.initStyle(StageStyle.TRANSPARENT);
    root.setVisible(true);

    scene.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("pressed");
        }
    });

    stage.show();
}

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

}

Я могу щелкать через прозрачные части в приложениях позади, что я и хочу. Однако я также не могу взаимодействовать с solid узлами в моей сцене; они тоже просматриваются, чего я не хочу. Это кажется проблемой только тогда, когда -fx-background-color имеет нулевое значение альфа.

Например, скажем, что этот узел является кнопкой. Я хочу иметь возможность таскать его по сцене; Я могу перетащить его один раз, но потом он снова становится неуправляемым. Однако простое нажатие на кнопку ни на что не влияет. Это сцена f xml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="eldai.FXMLController">
   <children>
      <Button fx:id="button" mnemonicParsing="false" text="Button" />
   </children>
</Pane>

и контроллер:

public class FXMLController implements Initializable {

@FXML
private Button button;

private double xOffset = 0;
private double yOffset = 0;

@Override
public void initialize(URL url, ResourceBundle rb) {

    button.setOnMousePressed(new EventHandler <MouseEvent>() {
        public void handle(MouseEvent e)
        {
            System.out.println("button pressed");
            xOffset = e.getX();
            yOffset = e.getY();
            e.setDragDetect(true);
        }
    });

    button.setOnMouseReleased(new EventHandler <MouseEvent>() {
        public void handle(MouseEvent e)
        {
            System.out.println("Button released.");
            e.setDragDetect(false);

        }
    });

    button.setOnMouseDragged(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent e) {
                button.setLayoutX(e.getSceneX() - xOffset);
                button.setLayoutY(e.getSceneY() - yOffset);
        }
    });
}

}

И контроллер сцены практически ничего не делает. Я пробовал установить для MouseTransparent значение false в различных точках, setPickOnBounds и т. Д. c. но, похоже, ничего из этого не работает. Я также, почему щелкать узел - это нормально, но как только я перетаскиваю его, взаимодействие теряется. Для моей программы очень важно, чтобы фон сцены оставался прозрачным; Я что-то упустил?

PS Я изначально пытался сделать это с помощью пользовательского F XML, и все это по-прежнему верно, за исключением того, что я должен заключить его в группу, если я хочу иметь возможность взаимодействовать с ним хоть раз. Я новичок в JavaFX; может кто-нибудь объяснить, почему это тоже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...