2016-05-04 5 views
0

Ich verwende bestimmte Ereignisse, um kleine Rechtecke auf einer HBox zu platzieren. Ihre Platzierung ist perfekt, wenn das Fenster nicht in der Größe geändert wurde, aber wenn Sie beispielsweise von klein auf Vollbild gehen, ist ihre Platzierung falsch (natürlich, weil sie zum Zeitpunkt der Platzierung einen bestimmten Wert für X erhalten) die Breite der HBox zu diesem bestimmten Zeitpunkt).Java Knoten dynamische Position auf HBox

Frage:

Wie kann ich diese Positionen dynamisch zu gestalten, so dass, wenn ich die Größe des Fensters, sie im Verhältnis bleiben?

Bilder: Normal view Fullscreen

Code:

@FXML HBox tagLine; // initializes the HBox 

... 

public void addTag(String sort) { 
    Rectangle rect = new Rectangle(20, tagLine.getHeight()); 
    double pos = timeSlider.getValue()/100 * tagLine.getWidth(); // retrieves position at the moment of being called 
    rect.setTranslateX(pos); 
    rect.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      showNotification("Gemarkeerde gebeurtenis: " + sort); 
     } 
    }); 
    rect.setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      notificationHide.play(); 
     } 
    }); 

    tagLine.getChildren().add(rect); 
} 
+0

Wie positionieren Sie den rect in der HBox? Spanne? einen Knoten auf der linken Seite platzieren? 'translateX'? – fabian

+0

Sie müssen uns etwas Code zeigen. Bearbeiten Sie einfach Ihre Frage und fügen Sie die Logik hinzu, die Sie derzeit zum Übersetzen des Rechtecks ​​verwenden. – ItachiUchiha

Antwort

1

Nur wenige Dinge, die Sie brauchen zu berücksichtigen, während eine Form mit verantwortlich Größe zu übersetzen ist, dass Sie brauchen, um :

  • Übersetzen Sie die Form von seinem Zentrum
  • Wenn die Übersetzung auf die Breite eines Knotens abhängt, auf die mit dieser bestimmten Knoten auf die vorgenommenen Änderungen hören und

entsprechend Änderungen an der übersetzen Eigenschaft machen Beide oben genannten Punkte scheinen in Ihrer Implementierung zu fehlen. Sie hören nie die Eigenschaft width von HBox. Ihre Berechnung für pos berücksichtigt auch nicht die Mitte von Rectangle.

Hier ist ein Beispiel, das versucht, das Rechteck in der Mitte zu halten, egal was die Größe Ihrer HBox ist.

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class Main extends Application { 

    private static final int SIDE = 40; 
    private static final double DEFAULT_WIDTH = 200; 
    private static final double DEFAULT_POSITION = 100; 

    @Override 
    public void start(Stage primaryStage) { 

     Rectangle rectangle = new Rectangle(SIDE, SIDE); 
     HBox root = new HBox(rectangle); 
     root.setPrefWidth(DEFAULT_WIDTH); 

     rectangle.translateXProperty().bind(root.widthProperty().multiply(DEFAULT_POSITION/DEFAULT_WIDTH).subtract(SIDE/2)); 

     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

enter image description here