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

为什么不可见的表视图会掩盖标签?

冯流觞
2023-03-14

我有一个奇怪的GUI问题。我正在使用JavaFX制作一个应用程序。该应用程序有不同的页面,每个页面都有标题、标签和tableView。让我们专注于欢迎页面。如果我只在我的vbox中添加一个tableView,一切看起来都很正常。

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

共有2个答案

徐隐水
2023-03-14

这个答案是在凯尤尔写他的时候写的。凯厄尔的答案是正确的,但鉴于我已经写了所有这些,我无论如何都会发布它:-)

不可见表没有覆盖字幕标签

将字幕的最小高度设置为 10:

subtitle.setMinHeight(10);

当没有足够的空间以首选大小显示布局区域中的所有内容时,布局窗格将开始减小其中项目的大小,直到所有内容都符合最小大小。这就是这里发生的事情,VBox布局管理器正在将字幕的大小减小到您设置的最小大小。

如果删除最小高度设置,则字幕标签不会被截断。

您可以将最小高度设置为首选高度:

subtitle.setMinHeight(Control.USE_PREF_SIZE);

这有时是有用的,但在这种情况下是不必要的(这里不需要设置最小高度,因为VBox布局管理器的默认行为将为标签分配足够的空间,使其完全垂直显示)。

不可见项仍然占用布局空间,即使您无法看到它们。想象一下,如果你的房间有一扇看不见的玻璃门,你试图离开房间,你会撞到你的头。那会很痛的。我已经做到了。很痛。

如果您也不希望不可见节点占用布局空间,则需要将其设置为非托管,请参见:

  • JavaFX - set可视化不会“隐藏”元素

其他布局建议

其中大部分与你的问题没有直接关系,所以请随意忽略它。只是一些背景信息。

您已在使用布局窗格,该窗格对项目(VBox)进行布局。不应为放置在布局窗格中的项目设置翻译值。翻译值(翻译X和翻译Y)实际上应该只是用于临时移动事物,例如OS X框样式的反弹动画。相反,布局应该通过布局X和布局Y值进行管理。使用布局管理器时,布局管理器负责设置 layoutX 和 layoutY 值,因此您不必设置任何转换值或布局值。

相反,您可以在布局管理器中为其管理的节点放置布局约束。例如,对于VBox,要将某些项偏移一个边距,可以使用<code>VBox。setMargin(节点)而不是更改转换值。设置转换值的问题是布局管理器会忽略它们,因此,尽管您可能会移动一个节点,但布局管理器不会自动正确设置其他托管节点的布局,并且可能会出现奇怪的重叠问题(尽管这不是您在这里遇到的问题的根源)。

Gluon SceneBuilder是一个很好的工具,可以了解更多关于JavaFX布局的信息(即使您不想使用FXML)。

学习布局的一个很好的例子是无泪布局。不幸的是,这个示例有点旧,使用了不推荐使用的构建器代码,但基本概念仍然有效,并且这些想法很容易转换为更现代的代码。甲骨文也有一个布局教程,但不幸的是,它还远远不够全面,事实上,我想到了“悲伤”这个词。。。

景区视图是了解应用程序布局(以及解决应用程序可能出现的问题的绝佳工具,就像您在这里一样)。

为了防止您的内容变得小于其首选大小,您可以将它放在ScrollPane中,并在内容溢出可用区域时让用户滚动(如网页)。

万高轩
2023-03-14

请以这种方式修改代码,然后进行检查。

删除这行:subtitle . setminheight(10);或者set:subtitle . setminheight(50);

subtitle.setMinHeight(50);
 类似资料:
  • JavaFX2教程有一个地址簿示例,它是一个表视图。 辅导的:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACFEHBI 编辑单元格的增强功能:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm 修改以添加复选框:h

  • 每当我运行它时,它只会显示图像应该位于的空间下的按钮,但即使图像空间在那里,也没有图像。 这是关于intelliJ的,我尝试了很多解决方案,但都不起作用。 代码的第一部分 代码的第二部分 文件夹

  • 我正在为客户重新设计一个应用程序,他们想显示一个图表。他们目前使用基础设施图表,他们希望停止使用该图表,但布局必须保持不变。 所以我的第一个选择是尝试Chart.js,但我只能得到这样的东西: 因此,基本上,唯一需要做的就是始终显示标签。 数据通过角度提供,如果是整数,则只是一个数组。对图表使用以下指令:http://jtblin.github.io/angular-chart.js/ 我当前的h

  • 我有一些奇怪的影响,当试图动画视图从消失到可见。见附件gif。 我有一个简单的,它切换的可见性。当更改为可见时,上会出现不希望的类似动画的影响。 我认为这与布局高度有关。请参见下面的布局。 当我删除,并将布局高度更改为时,它工作正常。但这不是解决方案,因为我最终需要一个。 如何避免按钮动画效果? 源代码:

  • 我有一个布局,即MotionLayout,它必须为我定义了motionscene约束集开始和结束的FrameLayouts。并且它们是正确的动画。 然后,在这个动画框架布局下,我添加了两个文本视图,在单击时,我尝试隐藏一个,显示另一个,但两个都保持可见 重写有趣的onViewCreated(View:View,SavedInstanceState:Bundle?){super.onviewcrea

  • 本文向大家介绍什么叫视图?游标是什么?相关面试题,主要包含被问及什么叫视图?游标是什么?时的应答技巧和注意事项,需要的朋友参考一下 答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特