当前位置: 首页 > 知识库问答 >
问题:

JavaFX调整根堆栈面板的大小

羊舌昆杰
2023-03-14

我想有一个StackPane作为根节点,它使叠加效果变得容易。

但是通过使用stackpane作为根,内部控件可以移出窗口。在下面的示例中,如果您将窗口缩小到足够小,您可以看到控件移出窗口,例如菜单栏和列表视图都移到左侧。我想防止这种情况,我该怎么做?

package test;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

    @Override 
    public void start(Stage stage) throws Exception {
        stage.setTitle("controls move out of window :(");

        Menu menu = new Menu("Menu");
        MenuBar menubar = new MenuBar(menu);

        ListView<String> listView = new ListView<>(FXCollections.observableArrayList("Args, it moves away."));

        BorderPane borderPane = new BorderPane();
        borderPane.setTop(menubar);
        borderPane.setLeft(listView);

        StackPane rootStackPane = new StackPane(borderPane);
        Scene scene = new Scene(rootStackPane);
        stage.setScene(scene);
        stage.show();
    }

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

}

更新:

为StackPane内部的BorderPane设置对齐方式似乎有所帮助:

public void start(Stage stage) throws Exception {
    stage.setTitle("controls stay in window :)");

    Menu menu = new Menu("Menu");
    MenuBar menubar = new MenuBar(menu);

    ListView<String> listView = new ListView<>(FXCollections.observableArrayList("it stays!"));

    BorderPane borderPane = new BorderPane();
    borderPane.setTop(menubar);
    borderPane.setLeft(listView);

    StackPane rootStackPane = new StackPane(borderPane);
    StackPane.setAlignment(borderPane, Pos.TOP_LEFT);
    Scene scene = new Scene(rootStackPane);
    stage.setScene(scene);

    stage.show();
}

共有1个答案

宇文勇
2023-03-14

将堆栈放在一个组中,并将堆栈的首选大小绑定到场景的首选大小。

从第二张图像中可以看出,叠加层不是以可见屏幕为中心,而是以StackPane为中心。StackPane的最小尺寸将是其最大组件的最小尺寸(即使它溢出屏幕),因此叠加层以此为中心。要找出事物的最小大小,您可以使用在 SceneBuilder 中设计 UI 或使用 ScenicView 调试 UI。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class App extends Application {

    @Override 
    public void start(Stage stage) throws Exception {
        stage.setTitle("controls stay in window :)");

        Menu menu = new Menu("Menu");
        MenuBar menubar = new MenuBar();
        menubar.getMenus().add(menu);

        ListView<String> listView = new ListView<>(FXCollections.observableArrayList("Args, it moves away."));

        BorderPane borderPane = new BorderPane();
        borderPane.setTop(menubar);
        borderPane.setLeft(listView);
        borderPane.setStyle("-fx-background-color: palegreen;");

        Node overlayContent = new Label("centered");
        StackPane stack = new StackPane(borderPane, overlayContent);

        Scene scene = new Scene(new Group(stack));
        stage.setScene(scene);
        stage.show();

        stack.prefWidthProperty().bind(scene.widthProperty());
        stack.prefHeightProperty().bind(scene.heightProperty());
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 我有一个JavaFX应用程序,它只有一个FXML文件。在这个文件中,我有一个AnchorPane,里面有一个StackPane。下面是截图: 当我启动这个应用程序时,我想用AnchorPane自动调整StackPane的大小。因此;StackPane将自动获得当前可用的宽度和高度。当我调整应用程序大小时,AnchorPane将自动调整大小,但StackPane将保持固定大小。 如何自动调整Stac

  • 问题内容: 我有一台服务器,可能导致以下输出死亡: 但是,如果没有堆栈转储或跟踪,就无法确定这是无限递归还是只是链太大而已,更不用说问题函数在哪里了。 使用该选项运行Node 不仅使我的测试运行缓慢(正如人们期望的那样),而且没有重现该问题。 有人有任何解决方案或提示来深入了解此问题吗? 问题答案: 看来目前的答案是:站稳脚步,等待Node.js更新到新的V8版本,或者使用此Chromium项目错

  • 问题内容: 当我运行我的代码时,Node.js引发由过多的递归调用引起的异常。我试图将Node.js堆栈大小增加,但是Node.js崩溃而没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将输出。是否有可能在不删除递归调用的情况下解决此问题? 问题答案: 您应该将递归函数调用包装到 , 要么 函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的 异步

  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

  • 如果用户未登录,我尝试将用户重定向到“TrapPage”。 这是我的代码: 当我将函数requireAuth放在onEnter上时,控制台给我一个错误: 我是一个反应迟钝的人,请耐心点:) 我的代码有什么问题?

  • 我正在尝试使用两列创建一个具有特定布局的窗口,但我不能完全按照我想要的方式工作。 首先,一些简化的示例代码: 以下是我想要的: 微调器和按钮应使用所有可用宽度 我试着使用各种各样的限制,但我无法让一切都正常工作。我认为我发现的主要问题是,在让微调器使用可用宽度后,它们在缩小窗口时拒绝收缩。 我正在Linux中使用Oracle JDK 1.8.0\u 60。