Spinner
을 만들고 값을 설정하지만 값을 다시 항목에 쓰지는 않습니다. 이렇게하려면이
가) 당신의 품목 클래스가 최대가)
b)는 모든 항목에 대해 동일한의 ObservableValue
경우, 최대 값과 현재 값 스피너에 대한 (또는은 현재 값을 포함 할 필요가 열에는 최대 값과 현재 값 모두에 대한 데이터가 있어야합니다. 또한`Node`s이 매우 큰 물체가 그들을 저장 ...이 모델과 뷰 사이에 정말 건강에 해로운 커플 링 결과
public static class Item {
private final IntegerProperty itemCount = new SimpleIntegerProperty();
private final IntegerProperty itemMaxCount = new SimpleIntegerProperty();
@Override
public String toString() {
return Integer.toString(getItemCount());
}
public Item(int disp, int max) {
this.itemCount.setValue(disp);
this.itemMaxCount.setValue(max);
}
public final int getItemCount() {
return this.itemCount.get();
}
public final void setItemCount(int value) {
this.itemCount.set(value);
}
public final IntegerProperty itemCountProperty() {
return this.itemCount;
}
public final int getItemMaxCount() {
return this.itemMaxCount.get();
}
public final void setItemMaxCount(int value) {
this.itemMaxCount.set(value);
}
public final IntegerProperty itemMaxCountProperty() {
return this.itemMaxCount;
}
}
@Override
public void start(Stage primaryStage) {
TableView<Item> tv = new TableView<>(FXCollections.observableArrayList(
new Item(1, 10),
new Item(0, 9),
new Item(1, 8),
new Item(0, 7),
new Item(1, 42),
new Item(0, 4),
new Item(1, 2),
new Item(0, 99),
new Item(1, 77),
new Item(0, 44),
new Item(1, 11),
new Item(0, 2),
new Item(1, 2),
new Item(0, 3),
new Item(1, 5),
new Item(0, 6)
));
TableColumn<Item, Item> countColumn = new TableColumn<>("count");
countColumn.setCellValueFactory(cd -> Bindings.createObjectBinding(() -> cd.getValue()));
countColumn.setCellFactory(new Callback<TableColumn<Item, Item>, TableCell<Item, Item>>() {
@Override
public TableCell<Item, Item> call(TableColumn<Item, Item> param) {
TableCell<Item, Item> cell = new TableCell<Item, Item>() {
private final Spinner<Integer> count;
private final SpinnerValueFactory.IntegerSpinnerValueFactory valueFactory;
private final ChangeListener<Number> valueChangeListener;
{
valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 0);
count = new Spinner<>(valueFactory);
count.setVisible(false);
setGraphic(count);
valueChangeListener = (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
valueFactory.setValue(newValue.intValue());
};
count.valueProperty().addListener((obs, oldValue, newValue) -> {
if (getItem() != null) {
// write new value to table item
getItem().setItemCount(newValue);
}
});
}
@Override
public void updateItem(Item item, boolean empty) {
// unbind old values
valueFactory.maxProperty().unbind();
if (getItem() != null) {
getItem().itemCountProperty().removeListener(valueChangeListener);
}
super.updateItem(item, empty);
// update according to new item
if (empty || item == null) {
count.setVisible(false);
} else {
valueFactory.maxProperty().bind(item.itemMaxCountProperty());
valueFactory.setValue(item.getItemCount());
item.itemCountProperty().addListener(valueChangeListener);
count.setVisible(true);
}
}
};
return cell;
}
});
tv.getColumns().add(countColumn);
Button btn = new Button("Print");
btn.setOnAction((ActionEvent event) -> {
System.out.println(tv.getItems());
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(new VBox(10, tv, btn));
primaryStage.setScene(scene);
primaryStage.show();
}
:
다음 예제는 단순히 열의 값으로 테이블 항목 자체를 사용 테이블 항목 클래스에서 항목 수가 많을수록 사용되는 메모리가 상당히 증가합니다. (실제 데이터를 저장하는 데 필요한 속성 수 : 2, Spinner의 속성 수 :> 100) – fabian
@ fabian에 동의합니다. 이것은 권장되는 해결책이 아닙니다. 'Node' 하위 클래스 (예 :'Spinner')를 데이터 유형 (예 :'TableColumn'열의 유형)으로 사용할 때마다 디자인이 잘못되었음을 나타내는 기호가됩니다. –