gpt4 book ai didi

java - 数量/Axis : how to force an immediate update of internal state during layout?

转载 作者:行者123 更新时间:2023-11-30 03:08:37 25 4
gpt4 key购买 nike

question about Slider 触发还有一个小错误,我尝试实现一个利用 Axis 服务的 SliderSkin,特别是其像素和值之间的转换方法。工作正常,只是 NumberAxis 将其转换偏移和比例因子保留为仅在布局过程中更新的内部字段。

如果我想在布局脉冲期间使用转换来更新另一个协作者,这会带来问题:在 slider 的情况下,这将是拇指。

下面是一个小例子来演示这个问题:只是一个 NumberAxis 和一个具有某个值的 CheckBox。启动时,该框被放置在中间的值处。为了获得最大效果,请最大化窗口并注意框位置未更改 - 现在位于 Axis 的起点附近。实际上,调整窗口大小时是一样的,但不那么明显 - 请参阅差异的打印输出。

使其发挥作用的选项

  • 延迟拇指定位,直到下一个布局脉冲(感觉笨拙)
  • 强制 Axis 立即更新

寻找后者的方法(除了反射调用 Axis 的layoutChildren之外找不到任何东西)。

示例:

public class AxisInvalidate extends Application {

public static class AxisInRegion extends Region {
NumberAxis axis;
Control thumb;
IntegerProperty value = new SimpleIntegerProperty(50);

private double thumbWidth;
private double thumbHeight;

public AxisInRegion() {
axis = new NumberAxis(0, 100, 25);
thumb = new CheckBox();
getChildren().addAll(axis, thumb);
}

@Override
protected void layoutChildren() {
thumbWidth = snapSize(thumb.prefWidth(-1));
thumbHeight = snapSize(thumb.prefHeight(-1));
thumb.resize(thumbWidth, thumbHeight);

double axisHeight = axis.prefHeight(-1);
axis.resizeRelocate(0, getHeight() /4, getWidth(), axisHeight);
// this marks the layout as dirty but doesn't immediately update internals
// doesn't make a difference, shouldn't be needed anyway
//axis.requestAxisLayout();

double pixelOnAxis = axis.getDisplayPosition(value.getValue());
Platform.runLater(() -> {
LOG.info("diff " + (pixelOnAxis - axis.getDisplayPosition(value.getValue())));
});
// moving this line into the runlater "solves" the problem
thumb.relocate(pixelOnAxis, getHeight() /4);

}

}

private Parent getContent() {
AxisInRegion region = new AxisInRegion();
BorderPane content = new BorderPane(region);
return content;
}

@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setScene(new Scene(getContent(), 500, 200));
primaryStage.show();
}

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

@SuppressWarnings("unused")
private static final Logger LOG = Logger.getLogger(AxisInvalidate.class
.getName());
}

实际上,I think it's a bug :值/像素转换是 Axis 的公共(public)服务 - 应该始终有效。

最佳答案

不确定它是否对您最初的问题有帮助,但只需手动进行计算即可。另一个优点 - 请求布局变得不必要,可以删除。

  double range = axis.getUpperBound()-axis.getLowerBound();
double pixelOnAxis = axis.getWidth()*(value.get()-axis.getLowerBound())/range;

关于java - 数量/Axis : how to force an immediate update of internal state during layout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34139076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com