4

我使用 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();
    }
}

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

如何解决属于两个不同窗格的控件重叠

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

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

4

2 回答 2

5

由于其 javadoc 中的提示,使用 填充空白BorderPane似乎不是一种选择:

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();
}

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

于 2013-11-12T13:05:48.293 回答
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 编辑器占用。

于 2013-11-12T10:50:36.733 回答