Почему высота компонента такая же, как у сцены, но кнопка внизу компонента заблокирована?
Я написал программу 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 заблокирована