如何在显示多个场景/节点时不打开多个阶段

时间:2016-10-14 21:08:00

标签: java javafx

我有一个可拖动的按钮类,它会在我的屏幕上显示一个按钮,可以通过鼠标拖动来移动它。然而,每个可拖动按钮位于单独的阶段 - >场景 - >窗格 - >节点中,以便单独地显示每个节点。 enter image description here

有没有办法在我的屏幕上添加多个可拖动按钮而无需打开数百万个阶段?

我想可能有一个与屏幕大小相同的透明舞台? 但是,如果我一次只能显示一个场景,我就不会看到它是如何工作的。

//Draggable button class

import javafx.scene.control.Button;
import javafx.stage.Stage;

public class DraggableButton extends Button{
    private double xOffset = 0;
    private double yOffset = 0;

    public DraggableButton(Stage stage){
        this.setOnMousePressed(event -> {
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        });
        this.setOnMouseDragged(event -> {
            stage.setX(event.getScreenX() - xOffset);
            stage.setY(event.getScreenY() - yOffset);
        });
    }
}
//Draggable button object

import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class ButtonDragV2 {
    private ButtonCollection btnCollection = ButtonCollection.getInstance();
    private Stage stage;
    private DraggableButton btn;
    private VBox root;
    private Scene scene;
    private ButtonStacker bs;

    public ButtonDragV2(){
        stage = new Stage();
        btn = new DraggableButton(stage);
        root = new VBox();
        scene = new Scene(root);
        bs = new ButtonStacker();

        stage.initStyle(StageStyle.UNDECORATED);
        root.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        btn.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        btn.setPrefSize(100,100);
        VBox.setVgrow(btn, Priority.ALWAYS);
        root.getChildren().add(btn);

        ...

        stage.show();
        btnCollection.addButton(this);
    {
{

3 个答案:

答案 0 :(得分:0)

如果设置了以下内容,请创建您创建的每个对话框:

stage.initOwner(mainStage);

到同一个initOwner只会有一个图标

答案 1 :(得分:0)

这里的问题是每次创建新的ButtonDragV2时都要实例化一个新的舞台,节点,场景等。你想要做的是在构造函数中注入依赖项,如下所示:

public class ButtonDragV2 {

    ...

    private Stage stage;
    private VBox root;
    private Scene scene;

    public ButtonDragV2(State stage, VBox root, Scene scene, ...){
        this.stage = stage;
        this.root = root;
        this.scene = scene;

        ...

    }
}

请注意,...语法不正确,我只是将它们放在这里,以表明如果可能的话,你可能会注入更多的依赖项(不能确定它们应该是什么,因为我不是熟悉javafx)。

最后,在我看来你应该只在构造函数中注入root并添加你的按钮,我没有看到你注入场景和舞台的原因,因为你似乎没有与它们交互一点都不您也不应该从按钮类调用stage.show(),因为从这里开始执行此操作并不合适。

PS:你应该看看几个面向对象的编程教程,以了解它是如何工作的,以及如何在你的代码中更好地实现它:)。

答案 2 :(得分:0)

您可以在同一Button中显示多个Scene

示例

@Override
public void start(Stage primaryStage) {
    Pane root = new Pane();
    root.setBackground(null);
    Node[] btns = new Node[5];
    for (int i = 0; i < btns.length; i++) {
        btns[i] = new Button("Button "+(i+1));
    }
    btns[0].relocate(10, 10);
    btns[1].relocate(400, 10);
    btns[2].relocate(200, 200);
    btns[3].relocate(10, 400);
    btns[4].relocate(400, 400);

    root.getChildren().addAll(btns);

    Scene scene = new Scene(root);
    scene.setFill(null);

    primaryStage.initStyle(StageStyle.TRANSPARENT);
    primaryStage.setMaximized(true);
    primaryStage.setScene(scene);
    primaryStage.show();
}