2016-10-14 3 views
0

Ich habe eine ziehbare Button-Klasse, die eine Schaltfläche auf meinem Bildschirm anzeigt, die mit der Maus verschoben werden kann. Allerdings befindet sich jede ziehbare Schaltfläche in einem separaten stage-> scene-> pane-> node, um sie einzeln anzuzeigen. enter image description hereWie mehrere Stufen nicht geöffnet werden können, während mehrere Szenen/Knoten angezeigt werden

Gibt es eine Möglichkeit, meinem Bildschirm mehrere ziehbare Schaltflächen hinzuzufügen, ohne dass Millionen von Phasen geöffnet sind?

Ich dachte, vielleicht mit einer transparenten Bühne die Größe des Bildschirms? Aber ich sehe nicht, wie das funktionieren würde, wenn ich nur eine Szene auf einmal zeigen kann.

//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); 
    { 
{ 

Antwort

0

Fro jeder Dialog Sie erstellen, wenn setzen Sie das:

stage.initOwner(mainStage); 

zum gleichen initOwner wird es nur ein Symbol sein

0

Das Problem ist hier, dass Sie ist Instanziieren Sie jedes Mal, wenn Sie ein neues ButtonDragV2 erstellen, eine neue Bühne, einen neuen Knoten, eine neue Szene usw. Was Sie tun möchten, ist stattdessen inject er im Konstruktor Abhängigkeiten wie folgt:

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; 

     ... 

    } 
} 

Beachten Sie, dass die ... nicht korrekte Syntax sind, ich stelle einfach diese hier zu zeigen, dass Sie möglicherweise mehr Abhängigkeiten, wenn möglich injizieren könnte (kann nicht sicher sagen, was sie sein sollten, da ich nicht mit javafx vertraut bin).

Schließlich, meiner Meinung nach, sollten Sie einfach die Wurzel in den Konstruktor injizieren und fügen Sie Ihre Schaltfläche, ich sehe keinen Grund, warum Sie Ihre Szene und Bühne injizieren, da Sie nicht zu interagieren scheinen sie überhaupt. Sie sollten auch nicht stage.show() von Ihrer Knopfklasse anrufen, da es von hier aus nicht wirklich angebracht ist.

PS: Sie sollten sich wahrscheinlich ein paar objektorientierte Programmierung Tutorials anschauen, um sich ein Bild davon zu machen, wie es funktioniert und wie es besser in Ihrem Code implementiert werden kann :).

0

Sie können mehrere Button s in demselben Scene anzeigen.

Beispiel

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