С некоторых пор я пытаюсь изменить цвет строки в соответствии со значением свойства в FXCollections
(после редактирования ячейки: true -> зеленая строка, false -> красная строка).В одном вопросе SO есть информация для использования Observable
.Я до сих пор не знаю, как его использовать, и теперь я пытаюсь понять пост @ kleopatra.Я добавил 3 элемента в choiceBox
, а затем, нажав кнопку, хотел бы изменить один из них.Каждый клик добавляет строку к choiceBox
.Зачем?Мне нужно обновить это или что-то?Я начал отображать все элементы при каждом нажатии, и количество элементов остается прежним, даже этот элемент изменяется.Может кто-нибудь объяснить мне, как это правильно редактировать?
Main.java:
public class Main extends Application {
public static int i = 0;
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
primaryStage.setTitle("Hello World");
ObservableList<Test> items = FXCollections.observableArrayList(e -> new Observable[]{e.nameProperty()});
Test test1 = new Test("test1");
Test test2 = new Test("test2");
Test test3 = new Test("test3");
Button button = controller.getButton();
button.setOnAction(e -> {
test1.setName("name changed" + ++i);
});
items.addAll(test1, test2, test3);
ChoiceBox choiceBox = controller.getChoiceBox();
choiceBox.setItems(items);
StringConverter<Test> converter = new StringConverter<Test>() {
@Override
public String toString(Test album) {
return album != null ? album.getName() : null;
}
@Override
public Test fromString(String string) {
return null;
}
};
choiceBox.setConverter(converter);
Scene scene = new Scene(root, 300, 275);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
sample.fxml:
<GridPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<ChoiceBox fx:id="choiceBox" GridPane.columnIndex="0" GridPane.rowIndex="0"></ChoiceBox>
<Button fx:id="button" GridPane.columnIndex="0" GridPane.rowIndex="1" text="CHANGE"></Button>
</GridPane>
Controller.java:
public class Controller {
@FXML
private ChoiceBox choiceBox;
@FXML
private Button button;
public ChoiceBox getChoiceBox() {
return choiceBox;
}
public void setChoiceBox(ChoiceBox choiceBox) {
this.choiceBox = choiceBox;
}
public Button getButton() {
return button;
}
public void setButton(Button button) {
this.button = button;
}
}
Test.java:
class Test {
StringProperty name;
public Test(String name) {
setName(name);
}
public StringProperty nameProperty() {
if (name == null) name = new SimpleStringProperty(this, "name");
return name;
}
public void setName(String name) {
nameProperty().set(name);
}
public String getName() {
return nameProperty().get();
}
}