2015-09-26 24 views
7

Mam okienko z niektórymi elementami sterującymi i przyciskiem. Kiedy klikam przycisk, chcę pokazać ProgressIndicator na środku panelu bez usuwania jakichkolwiek kontrolek.Jak wyświetlić ProgressIndicator w środkowej części panelu w Javafx

Dodanie do przycisku przycisku postępu w trakcie onAction przycisku powoduje jego dodanie pod przyciskiem. Chcę, żeby to nakładało się na szybę.

Poniższy obrazek wyjaśnia, czego chcę.

progress indicator

Kod

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); 
    } 
} 

Odpowiedz

12

Musisz użyć StackPane jako układu korzeniowego zamiast używać VBox. StackPane pozwala na układanie węzłów jeden na drugim (kolejność z).

W akcji przycisku możesz utworzyć nowy ProgressIndicator i dodać go do swojego StackPane. Wprowadziłem inny VBox jako rodzic do wskaźnika, ponieważ nie chciałem, aby wskaźnik przechwytywał całą dostępną przestrzeń. Możesz już teraz otrzymać VBox, aby uzyskać efekt greying na akcji przycisku po zakończeniu procesu, możesz ponownie włączyć VBox.

enter image description here


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); 
    } 
} 
+0

to działa dobrze, ale nakładka pokazać szary musiałem dodać vbox w moim układzie, ponieważ jeden bx.setDisable (true); nie wystarczy, aby pokazać szary również dodałem tekst ładowania za pomocą etykiety tekstowej = nowy tekst ("Ładowanie ... proszę czekać"); label.setBoundsType (TextBoundsType.VISUAL); label.setFill (Color.BLACK); –

Powiązane problemy