Почему высота компонента такая же, как у сцены, но кнопка внизу компонента заблокирована?

Я написал программу javafx (используйте maven + java17 + javafx17.0.1 + jfoenix9.0.10), которая создает окно шириной 1035 и высотой 680. Я сделал черный ящик в левой части окна. Черный ящик — это компонент ButtonsBox, и высота компонента тоже 680. Но когда я попытался добавить кнопку внизу компонента, кнопка была заблокирована окном. Почему высота компонента такая же, как у сцены, но кнопка была заблокирована окном?
Вот коды класса рисования. Когда приложение запускается, метод «start» в основном классе вызывает метод «draw» в классе «Draw».

      
package io.github.ctimet.lieinbedapp.gui;

import io.github.ctimet.lieinbedapp.gui.ui.ButtonsBox;
import io.github.ctimet.lieinbedapp.gui.util.CSSStyle;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.util.Objects;
import java.util.Optional;

public class Draw {
    private static final Logger logger = LoggerFactory.getLogger(Draw.class);

    private static final AnchorPane pane = new AnchorPane();

    public static void draw(Stage stage) {
        ButtonsBox box = new ButtonsBox(0, 0, 162, 680)
                .setSidesSpace(0)
                .setTopSpace(5)
                .setDownSpace(5)
                .setChildrenHeight(48)
                .setEachSpace(5)
                .setTextFill(Color.valueOf("#f5f5f5"))
                .setButtonStyle("/node.css", "button")
                .addTopButton("label", null, event -> {
                    System.out.println("Label");
                })
                .addTopButton("label2", null, event -> {
                    System.out.println("Label2");
                })
                .addDownButton("label3", null, event -> {
                    System.out.println("1");
                });
        CSSStyle.addDefaultStyle(box, "box");

        pane.getChildren().add(box);

        pane.setStyle("-fx-background-color: #f5f5f5;");

        Scene scene = new Scene(pane, 1035, 680);
        stage.setScene(scene);
        stage.setTitle("Lie In Bed");

        Image icon = new Image(Objects.requireNonNull(Draw.class.getResourceAsStream("/icon.png")));
        stage.getIcons().add(icon);
        stage.show();
    }
    
}

А вот коды класса ButtonsBox

      package io.github.ctimet.lieinbedapp.gui.ui;

import com.jfoenix.controls.JFXButton;
import io.github.ctimet.lieinbedapp.gui.util.CSSStyle;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;

public class ButtonsBox extends Pane {
    private double childrenHeight;
    private double sidesSpace;
    private double topSpace;
    private double downSpace;
    private double eachSpace;
    private String cssFile;
    private String cssClass;

    private Paint textFill = Color.WHITE;
    private int topButtonsQuantity = 0;
    private int downButtonsQuantity = 0;

    public ButtonsBox(double layoutX, double layoutY, double prefWidth, double prefHeight) {
        setLayoutX(layoutX);
        setLayoutY(layoutY);
        setPrefWidth(prefWidth);
        setPrefHeight(prefHeight);
    }

    public ButtonsBox setTopSpace(double topSpace) {
        this.topSpace = topSpace;
        return this;
    }

    public ButtonsBox setDownSpace(double downSpace) {
        this.downSpace = downSpace;
        return this;
    }

    public ButtonsBox setChildrenHeight(double childrenHeight) {
        this.childrenHeight = childrenHeight;
        return this;
    }

    public ButtonsBox setSidesSpace(double sidesSpace) {
        this.sidesSpace = sidesSpace;
        return this;
    }

    public ButtonsBox setEachSpace(double eachSpace) {
        this.eachSpace = eachSpace;
        return this;
    }

    public ButtonsBox setTextFill(Paint paint) {
        this.textFill = paint;
        return this;
    }

    public ButtonsBox setButtonStyle(String cssFile, String cssClass) {
        this.cssFile = cssFile;
        this.cssClass = cssClass;
        return this;
    }

    public ButtonsBox addTopButton(String label, Node graphic, EventHandler<ActionEvent> handler) {
        JFXButton child = new JFXButton(label);
        child.setLayoutX(getLayoutX() + sidesSpace);
        child.setLayoutY(topButtonsQuantity * (childrenHeight + eachSpace) + topSpace);
        child.setPrefWidth(getPrefWidth() - 2*sidesSpace);
        child.setPrefHeight(childrenHeight);
        child.setTextFill(textFill);
        child.setCursor(Cursor.HAND);
        if (graphic != null)
            child.setGraphic(graphic);
        if (cssClass != null && cssFile != null)
            CSSStyle.addStyle(child, cssClass, cssFile);
        child.setOnAction(handler);

        getChildren().add(child);
        topButtonsQuantity += 1;
        return this;
    }

    public ButtonsBox addDownButton(String label, Node graphic, EventHandler<ActionEvent> handler)  {
        JFXButton child = new JFXButton(label);
        child.setLayoutX(getLayoutX() + sidesSpace);
        System.out.println(getPrefHeight() - downButtonsQuantity * (childrenHeight + eachSpace) - downSpace);
        child.setLayoutY(getPrefHeight() - downButtonsQuantity * (childrenHeight + eachSpace) - downSpace);
        child.setPrefWidth(getPrefWidth() - 2*sidesSpace);
        child.setPrefHeight(childrenHeight);
        child.setTextFill(textFill);
        child.setCursor(Cursor.HAND);
        if (graphic != null)
            child.setGraphic(graphic);
        if (cssFile != null && cssClass != null)
            CSSStyle.addStyle(child, cssClass, cssFile);
        child.setOnAction(handler);

        getChildren().add(child);
        downButtonsQuantity += 1;
        return this;
    }
}

Когда я запускаю это приложение, оно покажет это . Как вы видете. Кнопка «Label3» не появляется в окне. Но когда я разворачиваю окно, кнопка Label3 появляется в левом нижнем углу окна. это
Что мне сделать, чтобы кнопка Label3 отображалась нормально, а не блокировалась?

Я пытался установить ширину и высоту сцены вручную, но это не сработало. Только когда я меняю высоту ButtonsBox, кнопка может отображаться нормально, но я не понимаю, почему высота ButtonsBox такая же, как у сцены, а кнопка Label3 заблокирована.
Я надеюсь, что кнопка Label3 может отображаться нормально, и я также хочу знать, почему кнопка Label3 заблокирована

0 ответов

Другие вопросы по тегам