2016-10-14 64 views
0

我有一個可拖動的按鈕類,它在我的屏幕上顯示一個按鈕,可以用鼠標拖動來移動。然而,每個可拖動的按鈕都在單獨的階段 - >場景 - >窗格 - >節點中,以便分別顯示每個按鈕。 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); 
    { 
{ 

回答

0

來回每次創建對話框,如果你設置:

stage.initOwner(mainStage); 

相同的initOwner只會有一個圖標

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不熟悉,無法確定它們應該是什麼)。

最後,在我看來,你應該只是在構造函數中注入根,並添加你的按鈕,我沒有看到你注入場景和舞臺的原因,因爲你似乎沒有與之交互他們。你也不應該在你的按鈕類中調用stage.show(),因爲從這裏開始並不適合。 PS:你應該看看幾個面向對象的編程教程,圍繞它的工作原理以及如何更好地在你的代碼中實現它:)。

0

您可以在同一個Scene中顯示多個Button s。

@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(); 
}