2015-12-28 56 views
1

我想在TableView中实现微调编辑器。我在这个主题上看到了各种各样的StackOverflow,但他们似乎没有解决这个问题。TableView中的JavaFX Spinner编辑器

我创建了从TableCell扩展的类。微调创建和所有内容,我无法让微调进行编辑。

private final class SpinnerCell extends TableCell<Car, Integer> { 
    private final ScrollSpinner<Integer> spinner; 

    private SpinnerCell(int min, int max, int initial, int step) { 
     spinner = new ScrollSpinner<>(); 
     spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step)); 
     setEditable(true); 
    } 

    @Override 
    public void startEdit() { 
     if (!isEmpty()) { 
      super.startEdit(); 
      spinner.getValueFactory().setValue(getItem()); 

      setOnKeyTyped(event -> { //I tried spinner.setOnKeyTyped, spinner.getEditor().setOnKeyTyped with no luck 
       if (event.getCode() == KeyCode.ENTER) { 
        Log.debug("commiting"); 
        commitEdit(spinner.getValue()); //FIXME Never commited 
       } 
      }); 

      setText(null); 
      setGraphic(spinner); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     setText(getItem().toString()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(Integer item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       setText(null); 
       setGraphic(spinner); 
      } else { 
       setText(getItem().toString()); 
       setGraphic(null); 
      } 
     } 
    } 
} 

}

回答

2

你必须改变onKeyTyped,以onKeyPressed。您还必须将commitEdit呼叫包装在Platform.runLater中。

private final class SpinnerCell extends TableCell<Car, Integer> { 
    private final ScrollSpinner<Integer> spinner; 

    private SpinnerCell(int min, int max, int initial, int step) { 
     spinner = new ScrollSpinner<>(); 
     spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step)); 
     setEditable(true); 
    } 

    @Override 
    public void startEdit() { 
     if (!isEmpty()) { 
      super.startEdit(); 
      spinner.getValueFactory().setValue(getItem()); 

      setOnKeyPressed(event -> { 
       if (event.getCode() == KeyCode.ENTER) { 
        Platform.runLater(() -> { 
         commitEdit(spinner.getValue()); 
        }); 
       } 
      }); 

      setText(null); 
      setGraphic(spinner); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     setText(getItem().toString()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(Integer item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       setText(null); 
       setGraphic(spinner); 
      } else { 
       setText(getItem().toString()); 
       setGraphic(null); 
      } 
     } 
    } 
}