2014-06-18 3 views
2

Предназначен следующий рабочий процесс: Пользователь нажимает кнопку -> В выбранном TreeItem должен быть создан новый TreeItem. Выбранный TreeItem должен получить расширен и новый TreeItem должны отображаться и ввод в режиме редактирования, как показано на следующем скриншоте:Почему режим редактирования JavaFX TreeTableView нежелательно отменен?

enter image description here

Unfortunatly редактирование режима, кажется, немедленно отменен в 99%, только в очень редких случаях ячейка остается в режиме редактирования. Я попытался реализовать свои собственные CellFactories и Editable-Cells, но для этого usecase я всегда оказываюсь в той же ситуации. Кто-нибудь знает, что я делаю неправильно здесь?

Я создал небольшой пример, демонстрирующий случай.

/** 
* Small Example for EditableState not initialized Case. 
* 
* @author mst 
*/ 
public class TreeTableViewCreateExpandAndEditMain extends Application 
{ 
    @Override 
    public void start(final Stage primaryStage) 
    { 
    TreeItem<Item> root = new TreeItem<>(new Item(1, "Root")); 

    TreeItem<Item> item1 = new TreeItem<>(new Item(2, "Item1")); 
    TreeItem<Item> item11 = new TreeItem<>(new Item(3, "Item11")); 
    TreeItem<Item> item2 = new TreeItem<>(new Item(4, "Item2")); 
    TreeItem<Item> item3 = new TreeItem<>(new Item(5, "Item3")); 
    TreeItem<Item> item31 = new TreeItem<>(new Item(6, "Item31")); 

    root.getChildren().add(item1); 
    item1.getChildren().add(item11); 
    root.getChildren().add(item2); 
    root.getChildren().add(item3); 
    item3.getChildren().add(item31); 

    TreeTableColumn<Item, Integer> columnId = new TreeTableColumn<>("ColumnId"); 
    TreeTableColumn<Item, String> columnName = new TreeTableColumn<>("ColumnName"); 

    columnId.setCellValueFactory(new TreeItemPropertyValueFactory<Item, Integer>("id")); 
    columnName.setCellValueFactory(new TreeItemPropertyValueFactory<Item, String>("name")); 

    columnName.setCellFactory(TextFieldTreeTableCell.forTreeTableColumn()); 

    columnName.setOnEditCommit(new EventHandler<CellEditEvent<Item, String>>() 
    { 
     @Override 
     public void handle(final CellEditEvent<Item, String> event) 
     { 
     final Item item = event.getRowValue().getValue(); 
     System.out.println("Change Item " + item + " from " + event.getOldValue() + " to new value " 
      + event.getNewValue()); 
     item.setName(event.getNewValue()); 
     } 
    }); 

    final TreeTableView<Item> treeTableView = new TreeTableView<>(root); 
    treeTableView.getColumns().add(columnName); 
    treeTableView.getColumns().add(columnId); 
    treeTableView.setShowRoot(false); 
    treeTableView.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY); 

    treeTableView.setEditable(true); 

    BorderPane layout = new BorderPane(); 

    Button button = new Button("DoAction!"); 
    button.setOnAction(new EventHandler<ActionEvent>() 
    { 
     @Override 
     public void handle(final ActionEvent event) 
     { 
     /* 
     * This Method should create a new node at the currently selected node, expand the selected node and start editing the new created node. 
     */ 
     final TreeItem<Item> selectedItem = treeTableView.getSelectionModel().getSelectedItem(); 

     final TreeItem<Item> newItem = 
      new TreeItem<>(new Item(100, "newItemFor" + selectedItem.getValue().getName())); 
     selectedItem.getChildren().add(newItem); 

     selectedItem.expandedProperty().set(true); 
     final int rowIndex = treeTableView.getRow(newItem); 

     treeTableView.edit(rowIndex, columnName);//Does 99% not start or get canceled, why? 
     } 

    }); 

    layout.setCenter(treeTableView); 
    layout.setBottom(button); 

    Scene scene = new Scene(layout, 400, 400); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

    public static void main(final String[] args) 
    { 
    launch(args); 
    } 
} 

DATACLASS:

public class Item 
{ 

    private final IntegerProperty id = new SimpleIntegerProperty(); 
    private final StringProperty name = new SimpleStringProperty(); 

    public Item(final int id, final String name) 
    { 
    this.id.set(id); 
    this.name.set(name); 
    } 

    public int getId() 
    { 
    return id.get(); 
    } 

    public String getName() 
    { 
    return name.get(); 
    } 

    public void setId(final int id) 
    { 
    this.id.set(id); 
    } 

    public void setName(final String name) 
    { 
    this.name.set(name); 
    } 

    public IntegerProperty idProperty() 
    { 
    return id; 
    } 

    public StringProperty nameProperty() 
    { 
    return name; 
    } 
} 
+1

Ваш код работает каждый раз (5 попыток) для меня в 1.8.0_20-ea на XP – brian

+0

о, это интересно. Во всех 5 попытках был изменен только отредактированный новый элемент, когда вы нажали кнопку? Я использую 8u5, думаю, что-то было исправлено в 8u20. Попробуем попробовать, спасибо! – crusam

+0

Правильно, нажмите кнопку, и новая ячейка ниже сосредоточена в режиме редактирования. – brian

ответ

1

Ваш код работал в 1.8.0_20-еа на XP для меня.

У меня часто возникали проблемы с потерей фокуса и другим странным поведением после редактирования. Иногда вам нужно переориентировать таблицу или ячейку, которую вы хотите. Я продолжаю обновлять java в надежде, что все это будет работать в один прекрасный день.

+0

Не могли бы вы оказать мне услугу и изменить размер окна приложения после того, как вы запустили приложение примерно на половину и/или вдвое больше первоначального размера, а затем нажмите кнопку для создания новых узлов? Сейчас я получаю странные результаты. Было бы очень приятно, если бы вы просто это подтвердили. – crusam

+0

Я попытался изменить размер в обоих направлениях, и он все еще работает нормально. Я нахожу, что javafx работает медленнее после изменения размера, и на моем компьютере немного отстает указатель. Это происходит во всех программах javafx на моем компьютере (amd X4) – brian

+0

Спасибо за тестирование. После дальнейших исследований я представил отчет об ошибках. Для вашего интереса: https://javafx-jira.kenai.com/browse/RT-37634. Кажется, что что-то не так с индексами в неизвестных условиях. – crusam

Смежные вопросы