我有一个奇怪的GUI问题。我正在使用JavaFX来制作应用程序。该应用程序具有不同的页面,每个页面都有标题、标签和表视图。让我们专注于欢迎页面。如果我只向我的 vbox 添加一个表视图,一切看起来都很正常。
vbox.getChildren().addAll(title, subtitle, reqTable);
但是当我添加所有三个表视图时,标题下方的标签被切断了。表格甚至还不可见!
vbox.getChildren().addAll(title, subtitle, reqTable, tempTable, ontTable);
知道为什么会这样吗?这是我的完整代码。谢谢!
package FLOOR;
// --- Imports
import javafx.application.Application;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
// --- Main Class
public class Example extends Application {
// --- All Pages
final Page[] pages = new Page[] {
new Page("Welcome!",
"Use the File menu to... n"),
};
// --- All Tables
TableView<ObservableList<StringProperty>> reqTable = new TableView<>();
TableView<ObservableList<StringProperty>> tempTable = new TableView<>();
TableView<ObservableList<StringProperty>> ontTable = new TableView<>();
// --- Current Page
final Label title = new Label();
final Label subtitle = new Label();
// --- Main
public static void main(String[] args) {
launch(args);
}
// --- Start
@Override
public void start(Stage stage) {
// --- Stage & Scene
stage.setTitle("APP");
Scene scene = new Scene(new VBox(), 900, 500);
MenuBar menuBar = new MenuBar();
// --- VBox
final VBox vbox = new VBox();
vbox.setAlignment(Pos.CENTER);
vbox.setSpacing(10);
vbox.setPadding(new Insets(5, 20, 0, 20));
vbox.getChildren().addAll(title, subtitle, reqTable, tempTable, ontTable);
//vbox.getChildren().addAll(title, subtitle, reqTable);
reqTable.setVisible(false);
tempTable.setVisible(false);
ontTable.setVisible(false);
reqTable.setMinHeight(300);
tempTable.setMinHeight(300);
ontTable.setMinHeight(300);
reqTable.translateYProperty().set(100);
tempTable.translateYProperty().set(-100);
ontTable.translateYProperty().set(-300);
// --- Welcome Page
title.setFont(new Font("Arial", 24));
title.translateYProperty().set(10);
title.setText(pages[0].title);
subtitle.setText(pages[0].subtitle);
subtitle.setMinHeight(10);
// --- Menus
// --- File Menu
// --- Import Submenu
Menu menuFile = new Menu("File");
Menu importMenu = new Menu("Import");
MenuItem opt1 = new MenuItem("opt_1");
MenuItem opt2 = new MenuItem("opt_2");
MenuItem opt3 = new MenuItem("opt_3");
importMenu.getItems().addAll(opt1, opt2, opt3);
MenuItem export = new MenuItem("Export");
MenuItem exit = new MenuItem("Exit");
menuFile.getItems().addAll(importMenu, export, new SeparatorMenuItem(), exit);
menuBar.getMenus().addAll(menuFile);
// --- Show
((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox);
stage.setScene(scene);
stage.show();
}
// Page Class
private class Page {
public String title;
public String subtitle;
public Page(String title, String subtitle) {
this.title = title;
this.subtitle = subtitle;
}
}
}
请以这种方式修改代码,然后检查。
删除此行:subtitle.setMinHeight(10); 或设置:subtitle.setMinHeight(50);
subtitle.setMinHeight(50);
这个答案是在Keyur写他的答案时写的。 Keyur的回答是正确的,但鉴于我已经写了所有这些,我还是会发布它:-)
不可见的表格没有遮盖字幕标签。
您可以将字幕的最小高度设置为 10:
subtitle.setMinHeight(10);
当没有足够的空间以首选大小显示布局区域中的所有内容时,布局窗格将开始减小其中项目的大小,直到达到最小大小的所有内容。 这就是这里发生的事情,VBox 布局管理器正在将字幕的大小减小到您设置的最小大小。
如果删除最小高度设置,则字幕标签不会被截断。
您可以将最小高度设置为首选高度:
subtitle.setMinHeight(Control.USE_PREF_SIZE);
这有时很有用,但在这种情况下是不必要的(此处根本不需要设置最小高度,因为 VBox 布局管理器的默认行为将为标签分配足够的空间,使其完全垂直显示)。
不可见项目仍然占用布局空间,即使您看不到它们。 想象一下,如果你的房间有一扇看不见的玻璃门,而你试图离开房间,你会撞到你的头。 会很痛的。 我已经做到了。 很痛。
如果您也不希望不可见节点占用布局空间,则需要将其设置为非托管节点,请参阅:
- JavaFX - setVisible 不会"隐藏"元素
其他布局建议
其中大部分与您的问题没有直接关系,因此请随意忽略它。 只是一些背景信息。
您已经在使用布局窗格,该窗格对项目进行布局(VBox)。 不应为布局窗格中放置的项目设置翻译值。 翻译值(translateX 和 translateY)实际上应该只是为了暂时移动东西,例如用于 OS X 盒子样式的弹跳动画。 相反,布局应该通过 layoutX 和 layoutY 值进行管理。 使用布局管理器时,布局管理器负责设置 layoutX 和 layoutY 值,因此您不必设置任何转换值或布局值。
相反,您将布局约束放在布局管理器上,以用于它管理的节点。 例如,对于 VBox,要按边距偏移某些项目,您可以使用VBox.setMargin(node)
而不是更改翻译值。 设置转换值的一个问题是布局管理器会忽略它们,因此尽管您可能会移动一个节点,但布局管理器不会自动正确设置其他托管式节点的布局,并且您可能会遇到奇怪的重叠问题(尽管这不是您在这里遇到的问题的根源)。
Gluon SceneBuilder 是学习更多关于 JavaFX 布局的好工具(即使你不想使用 FXML)。
学习布局的一个很好的例子是布局无泪。不幸的是,该示例有点旧,并且使用了已弃用的构建器代码,但基本概念仍然有效,并且这些想法很容易转移到更现代的代码中。 Oracle 也有一个布局教程,但不幸的是它远非全面,事实上,我想到了 woeful 这个词......
风景视图是了解应用程序布局(以及解决可能出现的问题)的绝佳工具,如下所示)。
若要防止内容的大小小于其首选大小,可以将其放在滚动窗格中,并在内容溢出可用区域(如网页)时让用户滚动。