在JavaFX中向窗口动态添加元素

时间:2015-01-10 03:04:09

标签: java user-interface javafx

我想要一个显示图像的窗口。这是窗口的主要目的。但是也应该可以在顶部进行控制。这个数字事先是未知的。可能是3或15.他们应该暂时堆积在那里。因此,上部增长,下面的图像被推下来。

enter image description here

void createNewWindow() {
    Stage stage = new Stage();
    BorderPane pane = new BorderPane();
    ImageView imageView = new ImageView("path");
    pane.setCenter(imageView);

    HBox controlBox = new HBox(10);
    pane.setTop(controlBox);

    Scene scene = new Scene(pane);
    stage.setScene(scene);
    stage.setResizable(true);
    stage.show();
}

此代码几乎无效。我必须手动添加宽度和高度,因为场景或舞台不会寻找任何适合的东西。当我稍后向顶部的HBox添加按钮时,窗口的大小不会增加,HBox(高度保持为0)也不会增加。只有图像被推下才能再看不到它。

我怎么会这样做?

3 个答案:

答案 0 :(得分:0)

您应该对controlBox的每个孩子使用HBox.setHgrow方法。

// for each button
HBox.setHgrow(child, Priority.ALWAYS);

这会使按钮彼此相邻,缩小尺寸,使所有尺寸都适合一行,并填充可用空间。

答案 1 :(得分:0)

JavaFX节点是动态可调整大小的,即子节点将填充父节点提供的空间,Parent将根据子节点所需的最小空间进行扩展。

在尝试将HBox添加到BorderPane时,我不会面临您提出的问题。添加HBox后,BorderPane高度增加(超过图像高度)。如果您想查看图像是否被按下,请尝试将VBox替换为HBox。

我使用365图片和26 HBox图片的简单示例,其结果为BorderPane 391高度

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class BorderPaneHeight extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane borderPane = new BorderPane();
        HBox box = new HBox(10);
        ImageView imageView = new ImageView(new Image("file:///home/itachi/Pictures/aaa.png")); // Replace with your image path
        Button button1 = new Button("Add");
        Button button2 = new Button("Add");
        box.getChildren().addAll(button1, button2);
        borderPane.setTop(box);
        borderPane.setCenter(imageView);
        Scene scene = new Scene(borderPane);
        primaryStage.setScene(scene);
        primaryStage.show();
        System.out.println("Image height : " + imageView.getImage().getHeight());
        System.out.println("Hbox height : " + box.getHeight());
        System.out.println("BorderPane Height : " + borderPane.getHeight());
    }
    public static void main(String[] args) {
        launch(args);
    }
}

在控制台上输出

Image height : 365.0
Hbox height : 26.0
BorderPane Height : 391.0

答案 2 :(得分:0)

对于随着窗口内容扩展而增长的窗口,我确实喜欢这样(看了但没有找到另一种解决方案)

在这种情况下,从MainController打开一个新窗口,这个窗口内容可以增长,我希望这个新窗口随之增长,所以在新窗口的控制器中我添加了一个监听器......

    containerPane.heightProperty().addListener((observable, oldValue, newValue) -> {
        MainController.theStage.setHeight(MainController.theStage.getHeight() + (newValue.doubleValue() - oldValue.doubleValue()));
    });