我使用某些事件在HBox上放置小矩形。当未调整窗口大小时,它们的放置是完美的,但是例如当您从小屏幕转到全屏显示时,它们的放置是错误的(当然,因为它们在放置时获得了X的特定值-这是通过获取HBox在该特定时刻的宽度)。
题:
如何使这些位置动态化,以便在调整窗口大小时它们保持比例?
图片:
码:
@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);
}
最佳答案
在转换具有适当大小的形状时,您需要考虑的几件事是:
从其中心平移形状
如果转换依赖于节点的宽度,请侦听对该特定节点的with所做的更改,并相应地更改translation属性
在您的实现中,以上两点似乎都没有。您从不收听HBox
的width属性。您对pos
的计算也不会考虑Rectangle的中心。
这是一个示例,无论您的HBox大小如何,都尝试将Rectangle保持在中心。
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);
}
}
关于java - HBox上的Java节点动态位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37038303/