Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Редактирование ячейки в TableView


Автор: Rusico 16.3.2016, 18:38
Доброго времени суток.

Необходимо при добавлении в TableView новой строки включить режим редактирования в ней. Всё прекрасно работает до тех пор, пока хотя бы раз не воспользуешься прокуруткой. Есть у кого-нибудь идеи как это исправить? Ниже привожу код. Заранее благодарен за ответы.

Код

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Test extends Application {
  
  public static void main(String[] args) {
    launch(args);
  }
  
  @Override
  public void start(Stage primaryStage) {
    TableView<MyRow> table = new TableView();
    TableColumn<MyRow, String> name = new TableColumn<>("name");
    name.setCellValueFactory(new PropertyValueFactory("name"));
    name.setCellFactory(TextFieldTableCell.forTableColumn());
    name.setEditable(true);
    table.setEditable(true);
    table.getColumns().add(name);
    VBox.setVgrow(table, Priority.ALWAYS);
    
    for(int i=0;i<100;i++)
      table.getItems().add(new MyRow(i+""+i+""+i));
    
    Button add = new Button("+");
    add.setOnAction(e -> {
      table.getItems().add(0, new MyRow("new"));
      table.edit(0, name);
    });
    
    primaryStage.setScene(new Scene(new VBox(5, add, table), 300, 250));
    primaryStage.show();
  }

  public class MyRow {
    private final StringProperty name = new SimpleStringProperty();
    
    public MyRow(String name) {
      this.name.setValue(name);
    }
    public String getName() {
      return name.get();
    }

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

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

Автор: samssrus 17.3.2016, 11:23
...странно, но у меня под Ubuntu с Java™ SE Runtime Environment (build 1.8.0_74-b02) нормально работает. Строки добавляются. После добавления редактируются. Прокрутка, добавление, редактирование в произвольных последовательностях - все ОК.

жутко давно не работал с java, но по старой памяти на ум приходит вот что:
- класс MyRow должен либо наследоваться от специализированного класса модели (Data Model), либо быть чем-то вроде массива.

посмотрите вот здесь http://docs.oracle.com/javafx/2/ui_controls/table-view.htm на ObservableList<> (должно выйти что-то вроде ObservableList<MyRow>).


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Redaktirovaniye-yacheyki-v-TableView-id56e97e16ae2015a6668b4567#findElement_E7045_56ea6972ae2015307e009d55_0

Автор: Rusico 18.3.2016, 13:22
принципиальной разницы нет, можно и так 

Код

ObservableList<MyRow> data = FXCollections.observableArrayList();
for(int i=0;i<100;i++)
  data.add(new MyRow(i+""+i+""+i));
table.setItems(data);


результат тот же.

Добавлено через 5 минут и 31 секунду
у меня Linuxmint java8 b java9 - глюк везде одинаковый

Добавлено через 9 минут и 26 секунд
Эксперимент: ставлю java 1.8.0_74-b02 ))

Автор: Rusico 18.3.2016, 13:42
Вот
java -version
java version "1.8.0_74"
Java™ SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot™ 64-Bit Server VM (build 25.74-b02, mixed mode)

но результат тот же(

Автор: dreindeimos 18.3.2016, 14:37
java -version
java version "1.8.0_74"
Java™ SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot™ 64-Bit Server VM (build 25.74-b02, mixed mode)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)