2013-07-22 1 views
0

J'ai cet exemple de base avec des boutons à bascule:Comment changer l'étiquette de touche tandis que le contenu du chargement

public class test extends Application 
{ 

    @Override 
    public void start(Stage primaryStage) 
    { 

     final VBox vbox = new VBox(); 

     String pillButtonCss = DX57DC.class.getResource("PillButton.css").toExternalForm(); 

     // create 3 toggle buttons and a toogle group for them 
     ToggleButton tb1 = new ToggleButton("Left Button"); 
     tb1.setId("pill-left"); 
     ToggleButton tb2 = new ToggleButton("Center Button"); 
     tb2.setId("pill-center"); 
     ToggleButton tb3 = new ToggleButton("Right Button"); 
     tb3.setId("pill-right"); 

     final ToggleGroup group = new ToggleGroup(); 
     tb1.setToggleGroup(group); 
     tb2.setToggleGroup(group); 
     tb3.setToggleGroup(group); 
     // select the first button to start with 
     group.selectToggle(tb1); 

     final Rectangle rect1 = new Rectangle(300, 300); 
     rect1.setFill(Color.DARKOLIVEGREEN); 
     final Rectangle rect2 = new Rectangle(300, 300); 
     rect2.setFill(Color.LAVENDER); 
     final Rectangle rect3 = new Rectangle(300, 300); 
     rect3.setFill(Color.LIGHTSLATEGREY); 

     tb1.setUserData(rect1); 
     tb2.setUserData(rect2); 
     tb3.setUserData(rect3); 

     group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Toggle> ov, Toggle toggle, Toggle new_toggle) 
      { 
       if (new_toggle == null) 
       { 
       } 
       else 
       { 
        vbox.getChildren().set(1, (Node) group.getSelectedToggle().getUserData()); 
       } 
      } 
     }); 

     HBox hBox = new HBox(); 
     hBox.getChildren().addAll(tb1, tb2, tb3); 
     hBox.setPadding(new Insets(10, 10, 10, 10)); 
     hBox.getStylesheets().add(pillButtonCss); 

     vbox.getChildren().addAll(hBox, (Node) group.getSelectedToggle().getUserData()); 

     StackPane root = new StackPane(); 
     root.getChildren().add(vbox); 

     Scene scene = new Scene(root, 800, 850); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

J'ai remarqué que si je mets la logique métier lourd dans les boutons lorsque je change les boutons, il semble que l'application se bloque .

Est-il possible d'afficher "Chargement .." au lieu de l'étiquette du bouton pendant que je change les boutons?

+0

Quand est-ce que la «logique métier lourde» a lieu exactement? Est-ce un clic sur l'action des boutons? –

+0

La logique métier est l'objet placé dans 'tb1.setUserData (rect1);'. Quand je change les objets dans 'setUserData()' l'application se bloque. –

Répondre

1

Je n'arrive pas vraiment à comprendre comment cela pourrait se bloquer, mais vous pouvez essayer de changer l'espace de travail dans un fil d'arrière-plan. Togeher avec l'étiquetage Button cela pourrait ressembler à ceci:

public class test 
    extends Application 
{ 

BorderPane workspace = new BorderPane(); 

@Override 
public void start(Stage primaryStage) 
{ 

    final VBox vbox = new VBox(); 

// String pillButtonCss = DX57DC.class.getResource("PillButton.css").toExternalForm(); 

    // create 3 toggle buttons and a toogle group for them 
    ToggleButton tb1 = new ToggleButton("Left Button"); 
    tb1.setId("pill-left"); 
    ToggleButton tb2 = new ToggleButton("Center Button"); 
    tb2.setId("pill-center"); 
    ToggleButton tb3 = new ToggleButton("Right Button"); 
    tb3.setId("pill-right"); 

    final ToggleGroup group = new ToggleGroup(); 
    tb1.setToggleGroup(group); 
    tb2.setToggleGroup(group); 
    tb3.setToggleGroup(group); 

    final Rectangle rect1 = new Rectangle(300, 300); 
    rect1.setFill(Color.DARKOLIVEGREEN); 
    final Rectangle rect2 = new Rectangle(300, 300); 
    rect2.setFill(Color.LAVENDER); 
    final Rectangle rect3 = new Rectangle(300, 300); 
    rect3.setFill(Color.LIGHTSLATEGREY); 

    tb1.setUserData(rect1); 
    tb2.setUserData(rect2); 
    tb3.setUserData(rect3); 

    group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() 
    { 
     @Override 
     public void changed(ObservableValue<? extends Toggle> ov, 
          Toggle toggle, 
          final Toggle new_toggle) 
     { 
      if (new_toggle != null) 
      { 
       final String toggleText = ((ToggleButton)new_toggle).getText(); 
       ((ToggleButton)new_toggle).setText("Loading..."); 

       Thread changeThread = new Thread(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         try 
         { 
          Thread.sleep(5000); 
         } 
         catch (InterruptedException e) 
         { 
         } 

         Platform.runLater(new Runnable() 
         { 
          @Override 
          public void run() 
          { 
           workspace.setCenter((Node)new_toggle.getUserData()); 
           ((ToggleButton)new_toggle).setText(toggleText); 
          } 
         }); 
        } 
       }); 
       changeThread.setDaemon(true); 
       changeThread.start(); 
      } 
     } 
    }); 

    HBox hBox = new HBox(); 
    hBox.getChildren().addAll(tb1, tb2, tb3); 
    hBox.setPadding(new Insets(10, 10, 10, 10)); 
// hBox.getStylesheets().add(pillButtonCss); 

    vbox.getChildren().addAll(hBox, workspace); 

    Scene scene = new Scene(vbox, 800, 850); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

    // select the first button to start with 
    group.selectToggle(tb1); 
} 

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

Le Thread.sleep (5000) simule le "retard" sur la commutation.

Questions connexes