Почему TableView / TableColumn не редактируется?

1

Из следующего FXML:

<?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, когда столбец "Дата калибровки" доступен для редактирования. Зачем?

Теги:
javafx
fxml
javafx-8
javafx-2

1 ответ

2
Лучший ответ

Это связано с тем, что фабрика ячеек по умолчанию не предоставляет редактор, как указано в документации javafx.scene.control.cell.TextFieldTableCell.

По умолчанию TextFieldTableCell отображается как метка, когда он не редактируется, и как TextField в режиме редактирования. TextField по умолчанию растягивается, чтобы заполнить всю ячейку таблицы.

Добавление следующего кода выполняет эту работу.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню