为什么组件没有出现在屏幕中央?

时间:2019-05-02 10:57:08

标签: java javafx

当用户运行程序时,我需要将场景的组件放置在窗口的中间,事实并非如此。我该如何解决? 该场景似乎只出现在右侧,而没有出现在中央。 我附加了我得到的输出图像。

public class WelcomeScene extends Scene{
    public WelcomeScene(Pane pane, double width, double height){
        super(pane,width,height);
        setFill(Color.PINK);
        VBox vbox = new VBox();
        Label label = new Label("Welcome to the typing\n practice world");
        label.setFont(new Font("Cambria", 32));
        label.setStyle("-fx-text-alignment: center;");
        label.setTextFill(Color.RED);
        label.centerShapeProperty().bind(pane.centerShapeProperty());

        HBox hbox = new HBox();
        Button StartTypingBtn = new Button("Start typing");
        Button showFingurePosition = new Button("Check fingures prositions");
        Button checkImprovement = new Button("Check Improvement");
        hbox.setSpacing(10);
        hbox.setAlignment(Pos.CENTER);

        hbox.getChildren().add(StartTypingBtn);
        hbox.getChildren().add(showFingurePosition);
        hbox.getChildren().add(checkImprovement);

        vbox.getChildren().addAll(label, new 
            ImageView("photos/hands_email.gif"),
                hbox);
        vbox.setAlignment(Pos.CENTER);
        pane.getChildren().add(vbox);
        pane.setCenterShape(true);
    }
}

public class Touch extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
        primaryStage.setScene(new WelcomeScene(new Pane(),
                screenBounds.getWidth(),screenBounds.getHeight()));
        primaryStage.show();
    }
    public static void main(String [] args) {
        Application.launch(args);
    }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以做的一件事就是将Pane更改为StackPane

  

触摸

primaryStage.setScene(new WelcomeScene(new StackPane(),
            screenBounds.getWidth(), screenBounds.getHeight()));
  

WelcomeScene

 public WelcomeScene(StackPane pane, double width, double height)
  

完整代码

触摸

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class Touch extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
        primaryStage.setScene(new WelcomeScene(new StackPane(),
                screenBounds.getWidth(), screenBounds.getHeight()));
        primaryStage.show();
    }

    public static void main(String[] args)
    {
        Application.launch(args);
    }
}

WelcomeScene

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;

public class WelcomeScene extends Scene
{
    public WelcomeScene(StackPane pane, double width, double height)
    {
        super(pane, width, height);
        try {
            setFill(Color.PINK);
            VBox vbox = new VBox();
            Label label = new Label("Welcome to the typing\n practice world");
            label.setFont(new Font("Cambria", 32));
            label.setStyle("-fx-text-alignment: center;");
            label.setTextFill(Color.RED);
            label.centerShapeProperty().bind(pane.centerShapeProperty());

            HBox hbox = new HBox();
            Button StartTypingBtn = new Button("Start typing");
            Button showFingurePosition = new Button("Check fingures prositions");
            Button checkImprovement = new Button("Check Improvement");
            hbox.setSpacing(10);
            hbox.setAlignment(Pos.CENTER);

            hbox.getChildren().add(StartTypingBtn);
            hbox.getChildren().add(showFingurePosition);
            hbox.getChildren().add(checkImprovement);

            vbox.getChildren().addAll(label, new ImageView(new Image(new FileInputStream("photos/hands_email.gif"))), hbox);
            vbox.setAlignment(Pos.CENTER);
            pane.getChildren().add(vbox);
            pane.setCenterShape(true);
        }
        catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

enter image description here

答案 1 :(得分:0)

一种可能性是您的vbox仅占用映像和hbox所需的空间。
尝试将vbox的高度和宽度设置为最大平衡,以便占用整个空间。