JavaFX 在组件不可见时填充空白区域?

问题描述 投票:0回答:2

我使用 Linux Suse 12.3、JDK 1.7.0-45、JavaFX 2.2.

我的问题是:为什么以下代码不起作用以及如何实现切换显示/隐藏功能?

这是我的测试代码:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;

public class Test extends Application {
    public static void main(String[] args) { 
        launch(args); 
    }

    @Override
    public void start(final Stage stage) {
        AnchorPane root = new AnchorPane();


        BorderPane inner = new BorderPane();

        AnchorPane.setTopAnchor(inner, 0.0);
        AnchorPane.setRightAnchor(inner, 0.0);
        AnchorPane.setBottomAnchor(inner, 0.0);
        AnchorPane.setLeftAnchor(inner, 0.0);

        final HTMLEditor center = new HTMLEditor();

        final ToolBar top = new ToolBar();
        final Button button = new Button("hide");
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                top.setVisible(false);
                //center.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);
            }
        });     

        center.setManaged(false);
        top.getItems().add(button);
        //top.managedProperty().bind(top.visibleProperty());
        top.setManaged(false);

        inner.setTop(top);
        inner.setCenter(center);

        root.getChildren().add(inner);
        Scene scene = new Scene(root,600,400);
        stage.setScene(scene);
        stage.show();
    }
}

我想要的是与谢尔盖对这个问题的解决方案相同的效果,但不改变宽度/高度!:

如何解决属于两个不同pane的控件相互重叠

正如我所说,它只是一个测试代码。我尝试使用另一个 Layouts 作为 BorderPane 但仍然无法正常工作。我不想手动重新计算大小......等等。删除节点并再次添加它不是我的选择。

我的代码有什么问题?欢迎任何想法! 谢谢

javafx visibility
2个回答
5
投票

使用

BorderPane
填充空白空间似乎不是一种选择,因为它的 javadoc 中有提示:

BorderPane 将每个子集布置在五个位置,而不管 孩子的可见财产价值;未管理的孩子将被忽略。

此外,使用

AnchorPane
仅用于可调整大小的内容:

AnchorPane.setTopAnchor(inner, 0.0);
AnchorPane.setRightAnchor(inner, 0.0);
AnchorPane.setBottomAnchor(inner, 0.0);
AnchorPane.setLeftAnchor(inner, 0.0);

似乎是过度使用。只需使用

VBox
将更适合您的布局案例。

重写测试代码:

@Override
public void start(final Stage stage) {
    final HTMLEditor center = new HTMLEditor();
    final ToolBar top = new ToolBar();

    final Button button = new Button("hide");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent t) {
            top.setVisible(false);
            top.setManaged(false);
        }
    });
    top.getItems().add(button);

    VBox inner = new VBox();
    inner.getChildren().addAll(top, center);
    Scene scene = new Scene(inner, 600, 400);
    stage.setScene(scene);
    stage.show();
}

现在的问题是;
您将如何实现“显示/隐藏”切换栏的“显示”部分?因为在你的问题中没有关于它的线索。


0
投票

尝试删除

top.setManaged(false);
线,然后将工具栏放入
Group
对象,如下所示:

Group g = new Group();
Region spacer = new Region();
spacer.setPrefWidth(10000);
spacer.setMinWidth(100);    
top.getItems().add(spacer);
g.getChildren().add(top); //Toolbar here...
inner.setTop(g); //set Group into Borderpane instead of the toolbar

单击按钮后,可用空间完全被 HTML 编辑器占用。

© www.soinside.com 2019 - 2024. All rights reserved.