如何使StackPane在JavaFX中填充BorderPane

时间:2017-01-04 14:53:14

标签: java javafx javafx-8

我有一个简单的JavaFX类,对于这个问题的结构是这样的。

BorderPane
     StackPane
         FlowPane

BorderPane包含StackPane,其中包含FlowPane。

现在我已经尝试了几天让StackPane填充其父级BorderPane,但似乎没有任何效果。最终结果应该是StackPane,其背景设置为" red"。

代码:

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author A4XX-COLCRI
 */
public class LogicGatesSimulator extends Application {
    /**
     * The root node of the application.
     */
    Group root;
    /**
     * This is the top-level container child of root.
     */
    BorderPane mainContainer;
    /**
     * Contains the canvas and represents the drawing area.
     */
    Pane canvasContainer;
    /**
     * Defines where all the shapes will be drawn.
     */
    Canvas canvas;
    /**
     * Defines the toolbox pane.
     */
    StackPane toolboxPane;
    /**
     * Defines the toolbox flowpane.
     */
    FlowPane toolbox;
    /**
     * Defines the top bar menu.
     */
    MenuBar menu;


    @Override
    public void start(Stage primaryStage) {
        // Inizializzazione degli elementi grafici
        root = new Group();
        mainContainer = new BorderPane();
        canvasContainer = new Pane();
        canvas = new Canvas();
        toolboxPane = new StackPane();
        toolboxPane.setStyle("-fx-background-color: red; ");
        toolbox = new FlowPane(Orientation.VERTICAL);
        toolbox.setPrefWrapLength(250);
        toolbox.minWidth(Region.USE_COMPUTED_SIZE);
        toolbox.minHeight(Region.USE_COMPUTED_SIZE);
        toolbox.maxWidth(Region.USE_COMPUTED_SIZE);
        toolbox.maxHeight(Region.USE_COMPUTED_SIZE);
        toolbox.prefHeight(Region.USE_COMPUTED_SIZE);
        //toolbox.setStyle("-fx-background-color: red;");

        // Inizializzazione scena
        Scene scene = new Scene(root, 1280, 800);
        primaryStage.setTitle("Logic Gates Simulator");
        primaryStage.setScene(scene);

        // Menu
        menu = new MenuBar();
        Menu menuFile = new Menu("File");
        Menu menuEdit = new Menu("Edit");
        Menu menuView = new Menu("View");
        Menu menuAbout = new Menu("About");
        menu.getMenus().addAll(menuFile, menuEdit, menuView, menuAbout);

        // Porte logiche nella toolbox 
        ImageView andImage = new ImageView(getClass().getResource("images/and.png").toExternalForm());
        ImageView nandImage = new ImageView(getClass().getResource("images/nand.png").toExternalForm());
        ImageView orImage = new ImageView(getClass().getResource("images/or.png").toExternalForm());
        ImageView norImage = new ImageView(getClass().getResource("images/nor.png").toExternalForm());
        ImageView xorImage = new ImageView(getClass().getResource("images/xor.png").toExternalForm());
        ImageView xnorImage = new ImageView(getClass().getResource("images/xnor.png").toExternalForm());
        ImageView notImage = new ImageView(getClass().getResource("images/not.png").toExternalForm());

        // Strutturazione
        toolboxPane.getChildren().add(toolbox);
        mainContainer.setLeft(toolboxPane);
        mainContainer.setRight(canvasContainer);
        toolbox.getChildren().addAll(andImage, nandImage, orImage, norImage, xorImage, xnorImage, notImage);
        canvasContainer.getChildren().add(canvas);
        root.getChildren().add(mainContainer);

        // Mostra la scena
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}     

我正在运行的应用程序的照片

enter image description here

所以基本上这个左侧区域应该完全填充我的BorderPane的左侧,因此背景应该正确覆盖其区域。 我也尝试将它从StackPane更改为AnchorPane并将其TopAnchor,LeftAnchor等设置为0,但它不起作用。 谢谢。

1 个答案:

答案 0 :(得分:2)

您从结构说明中忽略导致行为的部分:

Group

Group将其子女的大小调整为优先级。它不可调整大小,因此调整舞台大小不会影响Group或其中任何一个后代......

只需移除Group,然后使用mainContainer BorderPane作为场景根。