Я немного переработал ваш код.
1-я вещь: Всегда устанавливайте типы на Nodes
.
final ChoiceBox<String> cb1 = new ChoiceBox();
final ChoiceBox<String> cb2 = new ChoiceBox();
2-я вещь: Это ужасная идея, если вы хотите, чтобы String
вернулся.
cb2.getSelectionModel( ).selectedIndexProperty( ).addListener(
( ov, oldVal, newVal ) -> {
trace("cb2 listener");
// change label
int optionSelected = newVal.intValue();
List options = cb2.getItems();
String option = options.get(optionSelected).toString();
label.setText( option );
});
Вы должны сделать:
// Set the ChoiceBox 2 listener
cb2.getSelectionModel().selectedItemProperty().addListener(
( ov, oldVal, newVal ) -> {
trace("cb2 listener");
// change label
label.setText( newVal );
});
3-я вещь: Если вы знаете, что вы будете менять Collection
на Node
, используйте setAll()
вместо addAll()
.
Полный код:
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
/**
*
* @author orici
*/
public class MiDoubleChoiceBoxWithDependency extends Application {
private final Label label = new Label();
private final String[] contentsA = new String[] {
"Words 1",
"Words 2",
"Words 3"
};
private final String[] extra1 = new String[] {
"AAA",
"BBB",
"CCC"
};
private final String[] extra2 = new String[] {
"LLL",
"MMM",
"QQQ"
};
private final String[] extra3 = new String[] {
"XXX",
"YYY",
"ZZZ"
};
public static void main( String[] args ) {
launch( args );
}
@Override
public void start( Stage stage ) {
label.setFont( Font.font( "Arial", 25 ));
label.setText( extra1[0] );
////////////////////////////////////////////////////////////////
// ChoiceBoxes
ObservableList<String> options1 =
FXCollections.observableArrayList( extra1 );
ObservableList<String> options2 =
FXCollections.observableArrayList( extra2 );
ObservableList<String> options3 =
FXCollections.observableArrayList( extra3 );
// Create the ChoiceBoxes
final ChoiceBox<String> cb1 = new ChoiceBox(
FXCollections.observableArrayList( contentsA ));
final ChoiceBox<String> cb2 = new ChoiceBox();
cb2.getItems().addAll(options1);
// Default values for the ChoiceBoxes
cb1.setValue(contentsA[0]); // by value
cb2.getSelectionModel().select( 0 ); // by position
// Set the ChoiceBox 1 listener
cb1.getSelectionModel( ).selectedIndexProperty( ).addListener(
( ov, oldVal, newVal ) -> {
trace("cb1 listener");
// change second ChoiceBox values
int optionSelected = newVal.intValue();
if (optionSelected == 0)
cb2.getItems().setAll(options1);
if (optionSelected == 1)
cb2.getItems().setAll(options2);
if (optionSelected == 2)
cb2.getItems().setAll(options3);
// select the item in position 0
cb2.getSelectionModel().select( 0 ); // by position
}
);
// Set the ChoiceBox 2 listener
cb2.getSelectionModel().selectedItemProperty().addListener(
( ov, oldVal, newVal ) -> {
trace("cb2 listener");
// change label
label.setText( newVal );
}
);
////////////////////////////////////////////////////////////////
// place GUI elements
HBox hb = new HBox();
hb.getChildren( ).addAll( cb1, cb2, label );
hb.setSpacing( 30 );
hb.setAlignment( Pos.CENTER );
hb.setPadding( new Insets( 10, 0, 0, 10 ));
Scene scene = new Scene( hb, 400, 200 );
scene.setFill( Color.ALICEBLUE );
stage.setTitle( "2 ChoiceBoxes with control" );
stage.setScene( scene );
stage.show();
}
private void trace(String str) {
System.out.println(str);
}
} //class