Я пишу программу, в которой я хочу иметь возможность перетаскивать (и выполнять другие взаимодействия) узел вокруг рабочей области, но сцена и сцена прозрачны, поэтому вы можете видеть свой рабочий стол и другие приложения за ним. Это то, что у меня есть в 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; может кто-нибудь объяснить, почему это тоже?