This example drives the contents of a Label off of a ChoiceBox. The Bindings.selectString() line associates the selected ChoiceBox item -- a model object -- with the Label. Since the Label only displays a text value, there is an additional conversion to dig out the "description" property.
This file, ChoiceBoxApp, is a single ChoiceBox paired with a Label via JavaFX Binding.
package cb; import cb.model.*; import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.StringConverter; public class ChoiceBoxApp extends Application { @Override public void start(Stage primaryStage) throws Exception { ChoiceBox<Enemy> cbEnemy = new ChoiceBox< >(); cbEnemy.getItems().add( new Enemy() ); // null item clears label cbEnemy.getItems().add( new LightGrineer("Light Grineer")); cbEnemy.getItems().add( new MediumGrineer("Medium Grineer")); cbEnemy.getItems().add( new HeavyGrineer("Heavy Grineer")); cbEnemy.getItems().add( new LightCorpus("Light Corpus")); cbEnemy.getItems().add( new MediumCorpus("Medium Corpus")); cbEnemy.getItems().add( new HeavyCorpus("Heavy Corpus")); cbEnemy.getItems().add( new LightInfested("Light Infested")); cbEnemy.getItems().add( new MediumInfested("Medium Infested")); cbEnemy.getItems().add( new HeavyInfested("Heavy Infested")); cbEnemy.setConverter(new StringConverter() { @Override public String toString(Enemy object) { return object.getDescription(); } @Override public Enemy fromString(String string) { return null; } }); cbEnemy.getSelectionModel().select(0); // select the first empty item Label lblDescription = new Label(); // "DescriptionPane" lblDescription.textProperty().bind( Bindings.selectString(cbEnemy.getSelectionModel().selectedItemProperty(), "description") ); VBox vbox = new VBox(); vbox.setAlignment(Pos.CENTER); vbox.setSpacing( 40.0d ); vbox.getChildren().add( cbEnemy ); vbox.getChildren().add( lblDescription ); Scene scene = new Scene( vbox, 568, 320 ); primaryStage.setScene( scene ); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
The app works with several model classes. "Enemy" is a super class that also will handle an unspecified enemy through a blank selection in the ChoiceBox. "LightGrineer" is one of several similar classes that extend Enemy. I didn't print them all for brevity.
public class Enemy { private String description = ""; // displayed for empty obj public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Enemy() { } public Enemy(String description) { setDescription(description); } }
And LightGrineer
public class LightGrineer extends Enemy { public LightGrineer(String d) { super(d); } }
There is a warning message you get when running the app. It seems harmless as selecting items correctly updates the Label. I'll update the post if I find anything interesting out.
Update
I was getting the following warning when I started the app. This was before I made any selections on the ChoiceBox.Jul 11, 2016 8:13:45 PM com.sun.javafx.binding.SelectBinding$SelectBindingHelper getObservableValue WARNING: Exception while evaluating select-binding [description]
I fixed the warning message by making sure that the ChoiceBox's selectionModel started with a selected item. Apparently, the warning was from trying to bind to a property that wasn't initialized. Making sure that I made this call prior to binding on the lblDescription dispelled the error.
cbEnemy.getSelectionModel().select(0); // select the first empty item
No comments:
Post a Comment