我需要一个Pane的真正首选尺寸(儿童的结果),但我只得到-1。有没有可能找到它?
好的,这是一个示例代码: 输出为-1.0,0.0,-1.0,-1.0但显然带有按钮的窗格有一个"首选"尺寸!?只有新的Thread有输出" real"窗格的大小,但不是首选的窗格,因为如果我在3秒钟内调整窗口大小,它会显示"真正的"尺寸而不是开头的首选尺寸......
public class ButtonTest extends Application
{
public static void main(String [] a)
{
Application.launch(a);
}
@Override
public void start(Stage stage) throws Exception
{
BorderPane root = new BorderPane();
StackPane pane = new StackPane();
Button b = new Button("Testbutton");
pane.getChildren().add(b);
pane.setStyle("-fx-background-color: red;");
System.out.println(pane.getPrefWidth());
System.out.println(pane.getWidth());
System.out.println(pane.getMinWidth());
System.out.println(pane.getMaxWidth());
root.setCenter(pane);
Scene scene = new Scene(root);
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
Thread.sleep(3000);
} catch (InterruptedException e)
{
// TODO: Handle Exception
e.printStackTrace();
}
System.out.println(pane.getPrefWidth());
System.out.println(pane.getWidth());
System.out.println(pane.getMinWidth());
System.out.println(pane.getMaxWidth());
}
});
t.setDaemon(true);
t.start();
}
}
答案 0 :(得分:0)
默认情况下,StackPane具有由继承约束设置的PrefWidth和PrefHeight" USE_COMPUTED_SIZE" (女巫值等于-1)在父类" Region"。
中定义这个定义意味着将在布局过程中计算出更好的尺寸。
也许你的概念错过了。 Pref值用于布局过程,知道它应该如何在画布中排列对象。要知道组件的实际大小,您可以使用我之前提到的方法' getBoundsInParent()'或者' getBoundsInLocal()' (在javadoc中解释了thoose之间的差异)。
但是,了解组件在布局过程中计算出的大小非常重要。通常,布局过程发生在分离的线程上,而不是事件或main()线程。这就是为什么睡了3秒后让你做的伎俩。您可以尝试使用以下代码来让代码在JavaFX GUI线程中执行(从最后一行代码开始):
Platform.runLater(new Runnable() {
@Override public void run() {
<Your code in GUI Thread>
}
});
希望它可以提供一些帮助。很抱歉没有提供示例代码,但我没有安装环境的机器。我会尽力改善我的回答。
祝你好运。 (请任何人,随时纠正我的英语,我知道它很可怕)答案 1 :(得分:0)
好的,非常感谢您的探索。但是其他方法也没有返回正确的结果......
也许这个案例有助于理解我的目标是什么: 一个相关的问题是我有一个SplitPane,两个部分,现在我隐藏第二部分(分隔符位置= 1.0)并且仅显示第一部分,有时我也想显示第二部分。我这样做是为了重新划分分隔线。但在任何时候都可能发生,第二部分可以用新元素更新(=>更新必要的大小)。现在,要重新定位分隔符(带动画),我需要(隐藏)第二部分的首选大小?!如果没有真正的代码,您是否知道如何解决问题?
更新: 我用“实际大小”解决了问题,在窗格中添加了一个公共doubleproperty并将其绑定到窗格的widthproperty。现在我可以在splitpane中为这个doubleproperty添加一个changelistener。在第一次看到后,我得到了正确的像素大小。
public DoubleProperty realWidth;
pane.setPrefWidth(USE_PREF_SIZE);
pane.setMaxWidth(USE_PREF_SIZE);
realWidth = new SimpleDoubleProperty(0.0);
realWidth.bind(this.widthProperty());
=&GT;从其他地方添加更改侦听器
但是我知道如果我向窗格添加一个按钮(3秒后),则不会通知splitpane(此realWidth属性上的changelistener)......
更新:通知:D但是没有添加按钮而是添加了e。 G。堆栈窗格按预期工作。非常感谢您帮助了解它是如何工作的!