如何在Javafx中在窗格中央显示ProgressIndicator

如何在Javafx中在窗格中央显示ProgressIndicator,javafx,javafx-8,Javafx,Javafx 8,我有一个带有一些控件和按钮的窗格。当我点击按钮时,我希望在不移除任何控件的情况下在窗格中央显示ProgressIndicator 当我在按钮的操作期间向窗格添加ProgressIndicator时,它会将其添加到按钮下方。我希望它覆盖在窗格上 下面的图片解释了我想要什么 代码 package fx; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.Event

我有一个带有一些控件和按钮的窗格。当我点击按钮时,我希望在不移除任何控件的情况下在窗格中央显示ProgressIndicator

当我在按钮的
操作期间向窗格添加ProgressIndicator时,它会将其添加到按钮下方。我希望它覆盖在窗格上

下面的图片解释了我想要什么

代码

package fx;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage arg0) throws Exception {
    final VBox bx = new VBox();
    bx.setAlignment(Pos.CENTER);
    TextField userName = new TextField("User Name");
    userName.setMaxWidth(200);
    TextField email = new TextField("Email");
    email.setMaxWidth(200);
    Button submit = new Button("Submit");
    submit.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            ProgressIndicator pi = new ProgressIndicator();
            //adding here but it is adding at below of button
            //how to do here
            bx.getChildren().add(pi);
            //Further process
          }
    });
    bx.getChildren().addAll(userName, email, submit);
    Scene c = new Scene(bx);
    arg0.setScene(c);
    arg0.setMinWidth(500);
    arg0.setMinHeight(500);
    arg0.show();
  }

  public static void main(String[] args) {
     Main h = new Main();
     h.launch(args);
  }
}
package-fx;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ProgressIndicator;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
public void start(阶段arg0)引发异常{
最终VBox bx=新的VBox();
bx.设置校准(位置中心);
TextField userName=新的TextField(“用户名”);
userName.setMaxWidth(200);
TextField email=新的TextField(“email”);
email.setMaxWidth(200);
按钮提交=新按钮(“提交”);
submit.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
ProgressIndicator pi=新的ProgressIndicator();
//在此处添加,但在按钮下方添加
//这里怎么办
bx.getChildren().add(pi);
//进一步处理
}
});
bx.getChildren().addAll(用户名、电子邮件、提交);
场景c=新场景(bx);
arg0.1(c);
arg0.设置最小宽度(500);
arg0.设置最小高度(500);
arg0.show();
}
公共静态void main(字符串[]args){
Main h=新的Main();
h、 发射(args);
}
}
您需要使用根布局而不是VBox。StackPane允许您将节点堆叠在彼此的顶部(z顺序)

在按钮的操作中,您可以创建一个新的ProgressIndicator并将其添加到StackPane中。我引入了另一个VBox作为指示器的父级,因为我不希望指示器捕获所有可用空间。您可以
禁用
已存在的VBox,以获得按钮动作的
灰显
效果。完成此过程后,您可以再次启用VBox


导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ProgressIndicator;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
public void start(阶段arg0)引发异常{
StackPane root=新的StackPane();
VBox bx=新的VBox();
bx.设置校准(位置中心);
TextField userName=新的TextField(“用户名”);
userName.setMaxWidth(200);
TextField email=新的TextField(“email”);
email.setMaxWidth(200);
按钮提交=新按钮(“提交”);
submit.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
ProgressIndicator pi=新的ProgressIndicator();
VBox框=新的VBox(pi);
框。设置对齐(位置中心);
//灰色背景
bx.setDisable(真);
root.getChildren().add(框);
}
});
bx.getChildren().addAll(用户名、电子邮件、提交);
root.getChildren().add(bx);
场景c=新场景(根);
arg0.1(c);
arg0.设置最小宽度(500);
arg0.设置最小高度(500);
arg0.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

这很好,但是为了显示灰色,我不得不在布局中添加vbox,因为bx.setDisable(true)的一个;将不足以显示灰色,而且我添加了加载文本使用文本标签=新文本(“加载…请等待”);label.setBoundsType(textbundstype.VISUAL);标签:setFill(颜色:黑色);当您需要对按钮单击执行其他操作时,此操作将不起作用。例如,
ProcessIndicator
应在登录按钮上显示,并在用户验证后单击和隐藏。因为它只有在当前线程完成后才会打开。
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage arg0) throws Exception {
        StackPane root = new StackPane();
        VBox bx = new VBox();
        bx.setAlignment(Pos.CENTER);
        TextField userName = new TextField("User Name");
        userName.setMaxWidth(200);
        TextField email = new TextField("Email");
        email.setMaxWidth(200);
        Button submit = new Button("Submit");
        submit.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent event) {
                ProgressIndicator pi = new ProgressIndicator();
                VBox box = new VBox(pi);
                box.setAlignment(Pos.CENTER);
                // Grey Background
                bx.setDisable(true);
                root.getChildren().add(box);
            }
        });
        bx.getChildren().addAll(userName, email, submit);
        root.getChildren().add(bx);
        Scene c = new Scene(root);
        arg0.setScene(c);
        arg0.setMinWidth(500);
        arg0.setMinHeight(500);
        arg0.show();
    }

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