2016-06-14 4 views
1

테이블 셀에 회 전자를 설정할 수 있습니다.JavaFX의 TableView 및 Spinner

는하지만 문제는 내가() 내가 getSelectionModel를 사용하는 경우이 값을 얻을 수 아니에요 것입니다.

어떻게해야합니까?

QuantitaCol.setCellValueFactory(new PropertyValueFactory<Strumento, Integer>("Quantita_Disp")); 

QuantitaCol.setCellFactory(new Callback<TableColumn<Strumento,Integer>,TableCell<Strumento,Integer>>(){   
     @Override 
     public TableCell<Strumento, Integer> call(TableColumn<Strumento, Integer> param) {     
      TableCell<Strumento, Integer> cell = new TableCell<Strumento, Integer>(){ 
       @Override 
       public void updateItem(Integer item, boolean empty) { 
        if(item!=null){ 
         Spinner<Integer> quantita = new Spinner<Integer>(0, item, 1);  
         quantita.valueProperty().addListener(
           (obs, oldValue, newValue) -> { 
            System.out.println("New value: "+item); 

           } 
         ); 
         setGraphic(quantita); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 

답변

4

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(); 
} 
-1

대신

편집() 함수

TableColumn<Strumento, Spinner> SpinnerCol = new TableColumn<Strumento, Spinner>("Quantity"); 

     SpinnerCol.setMinWidth(500); 
     SpinnerCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Strumento, Spinner>, ObservableValue<Spinner>>() { 

      @Override 
      public ObservableValue<Spinner> call(
        TableColumn.CellDataFeatures<Strumento, Spinner> arg0) { 
       Strumento strumentoObject = arg0.getValue(); 

       Spinner<Integer> quantita = new Spinner<Integer>(0, 10, 1); 
       quantita.valueProperty().addListener(
         (obs, oldValue, newValue) -> { 
          System.out.println("New value: " + newValue); 

          strumentoObject.setSpinnerValue(newValue); 



         } 
       ); 

       return new SimpleObjectProperty<Spinner>(quantita); 

      } 

     }); 
     table.getColumns().add(SpinnerCol); 

에 updateItem()와 setGraphic를 사용하는이 대체 코드를 사용해보십시오 :

내가 현재 사용하고있는 코드는 이것이다

이 솔루션이 신속하게 문제를 해결하지만 fabian's 해결책을 따라 reco 아래의 코멘트에서 전문가에 의해 설명됩니다.

+3

:

다음 예제는 단순히 열의 값으로 테이블 항목 자체를 사용 테이블 항목 클래스에서 항목 수가 많을수록 사용되는 메모리가 상당히 증가합니다. (실제 데이터를 저장하는 데 필요한 속성 수 : 2, Spinner의 속성 수 :> 100) – fabian

+2

@ fabian에 동의합니다. 이것은 권장되는 해결책이 아닙니다. 'Node' 하위 클래스 (예 :'Spinner')를 데이터 유형 (예 :'TableColumn '열의 유형)으로 사용할 때마다 디자인이 잘못되었음을 나타내는 기호가됩니다. –