2015-09-26 11 views
7

Ho un pannello con alcuni controlli e un pulsante. Quando clicco sul pulsante, voglio mostrare ProgressIndicator al centro del riquadro senza rimuovere alcun controllo.Come mostrare ProgressIndicator nel centro del riquadro in Javafx

Quando aggiungo un ProgressIndicator al pannello durante il onAction di pulsante, lo aggiunge sotto il pulsante. Voglio che si sovrapponga al pannello.

L'immagine seguente spiega cosa voglio.

progress indicator

Codice

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

risposta

12

È necessario utilizzare un StackPane come il layout radice invece di utilizzare un VBox. StackPane ti consente di impilare nodi uno sopra l'altro (ordine z).

Sull'azione del pulsante è possibile creare un nuovo ProgressIndicator e aggiungerlo allo StackPane. Ho introdotto un altro VBox come genitore dell'indicatore, perché non volevo che l'indicatore catturasse tutto lo spazio disponibile. È possibile disable l'VBox già presente per ottenere l'effetto greying sull'azione del pulsante dopo aver completato il processo è possibile abilitare nuovamente il 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

Questo funziona bene, ma la sovrapposizione di mostrare il grigio ho dovuto aggiungere il VBOX nel mio layout perché quello bx.setDisable (true); non basterà mostrare il grigio aggiungo anche il testo di caricamento usando l'etichetta Testo = nuovo Testo ("Caricamento in corso ... Attendere"); label.setBoundsType (TextBoundsType.VISUAL); label.setFill (Color.BLACK); –

Problemi correlati