2014-04-25 52 views
1

从以下FXML:为什么TableView/TableColumn不可编辑?

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 

<VBox spacing="10" xmlns:fx="http://javafx.com/fxml"> 
    <Label  fx:id="_lru"  styleClass="wizard-title-centered" /> 
    <Label  fx:id="_prompt" styleClass="wizard-label" /> 
    <TableView fx:id="_tableVw" maxWidth="560" prefHeight="200" editable="true"> 
    <columns> 
     <TableColumn fx:id="_name"   prefWidth="220" editable="false" /> 
     <TableColumn fx:id="_partNum"   prefWidth= "80" editable="false" /> 
     <TableColumn fx:id="_serialNum"  prefWidth= "84" editable="true" /> 
     <TableColumn fx:id="_calibrationDate" prefWidth="120" editable="true" /> 
     <TableColumn fx:id="_available"  prefWidth= "40" editable="false" /> 
    </columns> 
    </TableView> 
    <Text fx:id="_note" wrappingWidth="550" styleClass="wizard-label" /> 
</VBox> 

关联到下面的Java类:

public class Page extends AbstractPage<Data> implements Initializable { 

    @FXML private Label       _lru; 
    @FXML private Label       _prompt; 
    @FXML private TableView<Record>    _tableVw; 
    @FXML private TableColumn<Record, String> _name; 
    @FXML private TableColumn<Record, String> _partNum; 
    @FXML private TableColumn<Record, String> _serialNum; 
    @FXML private TableColumn<Record, LocalDate> _calibrationDate; 
    @FXML private TableColumn<Record, Boolean> _available; 
    @FXML private Text       _note; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     _lru   .setText(_worker.getData()._tpsSoftName); 
     _prompt   .setText(I18n.get("EXTERNAL_RC_PROMPT" )); 
     _name   .setText(I18n.get("EXTERNAL_RC_NAME" )); 
     _partNum  .setText(I18n.get("EXTERNAL_RC_PARTNUM" )); 
     _serialNum  .setText(I18n.get("EXTERNAL_RC_SERIALNUM")); 
     _calibrationDate.setText(I18n.get("EXTERNAL_RC_CALIB" )); 
     _available  .setText(I18n.get("EXTERNAL_RC_AVAILABLE")); 
     _note   .setText(I18n.get("EXTERNAL_RC_NOTE" )); 
     _name   .setCellValueFactory(new PropertyValueFactory<Record, String> ("name")); 
     _partNum  .setCellValueFactory(new PropertyValueFactory<Record, String> ("partNum")); 
     _serialNum  .setCellValueFactory(new PropertyValueFactory<Record, String> ("serialNum")); 
     _calibrationDate.setCellValueFactory(new PropertyValueFactory<Record, LocalDate>("calibrationDate")); 
     _available  .setCellValueFactory(new PropertyValueFactory<Record, Boolean> ("available")); 
     _calibrationDate.setCellFactory(
     new Callback<TableColumn<Record,LocalDate>, TableCell<Record,LocalDate>>() { 
     @Override public TableCell<Record,LocalDate> call(TableColumn<Record,LocalDate> c) { 
      return new DatePickerCell<>(); }}); 
     _available.setCellFactory(
     new Callback<TableColumn<Record,Boolean>, TableCell<Record,Boolean>>() { 
     @Override public TableCell<Record,Boolean> call(TableColumn<Record,Boolean> c) { 
      return new CheckBoxTableCell<>(); }}); 
    } 

    @Override 
    public void processDone(boolean successfully) { 
     _tableVw.getItems().setAll(_worker.getData()._resources); 
    } 
} 

双击SERIALNUM列时,“校准日期”一栏是编辑不激活基础TextField。 为什么?

回答

2

这是因为默认的单元工厂不提供javafx.scene.control.cell.TextFieldTableCell文档中指定的编辑器。

默认情况下,TextFieldTableCell呈现为一个标签时被编辑不 ,并且作为一个TextField当在编辑模式。默认情况下,TextField 将伸展以填充整个表格单元格。

添加下面的代码来完成这项工作。

_serialNum.setCellFactory(TextFieldTableCell.<Record>forTableColumn());