it-swarm.com.ru

Элементы обновления JavaFX 2.1 TableView

У меня есть эта общая проблема, как кажется. Мой табличный вид не обновит мои элементы после их сброса. Я проверил данные, и это новый. 

Я пробовал несколько решений из Интернета, но безуспешно.  

Невозможно сбросить все столбцы, потому что он добавляет одну пустую дополнительную (не знаю почему), а изменение размера просто прерывается.

Моя таблица не редактируемая . Новые данные изменены.

Данные обновляются, если я изменяю порядок элементов, а строки меняются (: |).

Я просто остался без идей.

На данный момент код обновления довольно прост.

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);

Снова новые данные верны. Когда я делаю выбор к tableView, он возвращает новый правильный Item.

54
user1236048

У меня была похожая проблема с обновлением. Мое решение состояло в том, чтобы ограничить операции с ObservableList теми, которые корректно работают с bind().

Предположим, что ObservableList obsList является базовым списком для TableView

Затем
obsList.clear() (унаследованная от Java.util.List<>) будет не обновляться TableView правильно, но.

Также вызов setItem(obsList) сделал не работает для запуска обновления ... но ...

obsList.removeAll(obsList) (перезаписывается ObservableList) работает нормально потому что корректно запускает changeEvent.

Пополнение списка с совершенно новым содержанием тогда работает следующим образом:

  • obsList.removeAll(obsList);
  • obsList.add(...); //e.g. in a loop...

или же

  • obsList.removeAll(obsList);
  • FXCollections.copy(obsList, someSourceList)

С наилучшими пожеланиями Инго

34
Ingo

Временное решение:

 tableView.getColumns().get(0).setVisible(false);
 tableView.getColumns().get(0).setVisible(true);
59
Daniel De León

Поскольку JavaFX 8u60 вы можете использовать (при условии, что tableView является экземпляром TableView class):

tableView.refresh();

Из документации:

Вызов refresh () заставляет элемент управления TableView воссоздать и заселить клетки, необходимые для заполнения визуальных границ контроль. Другими словами, это заставляет TableView обновлять то, что он показывает пользователю. Это полезно в тех случаях, когда основной источник данных изменился таким образом, который не наблюдается в TableView сам.

37
Elltz

Обновление:
Наконец, обновление табличного представления разрешено в JavaFX 8u60, который доступен для раннего доступа.


Об обновлении смотрите Обновление строк в Tableview .
А о пустом столбце см. JavaFx 2 create TableView с одним столбцом . По сути, это не столбец, то есть вы не можете выбрать элемент, щелкнув по элементам этого пустого столбца. Это просто пустое место в стиле строки.


UPDATE: Если вы обновляете tableView с помощью reseller_table.setItems(data), вам не нужно использовать SimpleStringProperty. Было бы полезно, если бы вы обновляли только одну строку/элемент. Вот полный рабочий пример обновления данных таблицы: 

import Java.util.ArrayList;
import Java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
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.layout.VBox;
import javafx.stage.Stage;

public class Dddeb extends Application {

    public static class Product {
        private String name;
        private String code;

        public Product(String name, String code) {
            this.name = name;
            this.code = code;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getName() {
            return name;
        }

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

    private TableView<Product> productTable = new TableView<Product>();

    @Override
    public void start(Stage stage) {

        Button refreshBtn = new Button("Refresh table");
        refreshBtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                // You can get the new data from DB
                List<Product> newProducts = new ArrayList<Product>();
                newProducts.add(new Product("new product A", "1201"));
                newProducts.add(new Product("new product B", "1202"));
                newProducts.add(new Product("new product C", "1203"));
                newProducts.add(new Product("new product D", "1244"));

                productTable.getItems().clear();
                productTable.getItems().addAll(newProducts);
                //productTable.setItems(FXCollections.observableArrayList(newProducts));
            }
        });

        TableColumn nameCol = new TableColumn("Name");
        nameCol.setMinWidth(100);
        nameCol.setCellValueFactory(new PropertyValueFactory<Product, String>("name"));

        TableColumn codeCol = new TableColumn("Code");
        codeCol.setCellValueFactory(new PropertyValueFactory<Product, String>("code"));

        productTable.getColumns().addAll(nameCol, codeCol);
        productTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        // You can get the data from DB
        List<Product> products = new ArrayList<Product>();
        products.add(new Product("product A", "0001"));
        products.add(new Product("product B", "0002"));
        products.add(new Product("product C", "0003"));

        //productTable.getItems().addAll(products);
        productTable.setItems(FXCollections.observableArrayList(products));

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.getChildren().addAll(productTable, refreshBtn);

        Scene scene = new Scene(new Group());
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        stage.setScene(scene);
        stage.setWidth(300);
        stage.setHeight(500);
        stage.show();
    }

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

Обратите внимание, что

productTable.setItems(FXCollections.observableArrayList(newProducts));

а также 

productTable.getItems().clear();
productTable.getItems().addAll(newProducts);

почти эквивалентны. Таким образом, я использовал тот, чтобы заполнить таблицу в первый раз, и другой, когда таблица обновляется. Это только для демонстрационных целей. Я проверил код в JavaFX 2.1. И, наконец, вы можете (и должны) отредактировать свой вопрос, чтобы улучшить его, переместив фрагменты кода в своем ответе на свой вопрос.

7
Uluk Biy

Я наконец нашел уродливый обходной путь, чтобы обновить все строки.

void refreshTable() {
    final List<Item> items = tableView.getItems();
    if( items == null || items.size() == 0) return;

    final Item item = tableView.getItems().get(0);
    items.remove(0);
    Platform.runLater(new Runnable(){
        @Override
        public void run() {
            items.add(0, item);
        }
    });
 }
6
Javarian

Кажется, есть несколько отдельных проблем вокруг oldItems.equals (newItems)

Первая часть RT-22463 : tableView не будет обновляться даже при вызове items.clear ()

// refresh table 
table.getItems().clear();
table.setItems(listEqualToOld);    

это исправлено Очистка старых элементов перед установкой нового списка очищает все старое состояние, таким образом обновляя таблицу. Любой пример, где это не работает, может быть регрессией.

Что еще не работает, так это переустанавливать элементы без предварительной очистки

// refresh table
table.setItems(listEqualToOld); 

Это проблема, если в таблице показаны свойства, которые не участвуют в одинаковом решении элемента (см. Пример в RT-22463 или Aubin's ) и покрыты - мы надеемся - RT -39094

UPDATE: RT-39094 последний также исправлен, для 8u40! Должен всплыть в EA через пару недель, спекулируя на u12 или около того. 

Техническая причина, по-видимому, заключается в проверке на равенство в реализации ячейки: для исправления проблем с производительностью была введена проверка изменений элемента перед фактическим вызовом updateItem (T, boolean). Разумно, просто жестко закодировать «изменить» == old.equals (new) создает проблемы в некоторых контекстах. 

Обходной путь для меня (без формального тестирования!) - это пользовательский TableRow, который включается, если требуется проверка личности:

/**
 * Extended TableRow that updates its item if equal but not same.
 * Needs custom skin to update cells on invalidation of the 
 * item property.<p>
 * 
 * Looks ugly, as we have to let super doing its job and then
 * re-check the state. No way to hook anywhere else into super 
 * because all is private. <p>
 * 
 * Super might support a configuration option to check against
 * identity vs. against equality.<p>
 * 
 * Note that this is _not_ formally tested! Any execution paths calling
 * <code>updateItem(int)</code> other than through 
 * <code>indexedCell.updateIndex(int)</code> are not handled.
 * 
 * @author Jeanette Winzenburg, Berlin
 */
public class IdentityCheckingTableRow<T>  extends TableRow<T> {

    @Override
    public void updateIndex(int i) {
        int oldIndex = getIndex();
        T oldItem = getItem();
        boolean wasEmpty = isEmpty();
        super.updateIndex(i);
        updateItemIfNeeded(oldIndex, oldItem, wasEmpty);

    }

    /**
     * Here we try to guess whether super updateIndex didn't update the item if
     * it is equal to the old.
     * 
     * Strictly speaking, an implementation detail.
     * 
     * @param oldIndex cell's index before update
     * @param oldItem cell's item before update
     * @param wasEmpty cell's empty before update
     */
    protected void updateItemIfNeeded(int oldIndex, T oldItem, boolean wasEmpty) {
        // weed out the obvious
        if (oldIndex != getIndex()) return;
        if (oldItem == null || getItem() == null) return;
        if (wasEmpty != isEmpty()) return;
        // here both old and new != null, check whether the item had changed
        if (oldItem != getItem()) return;
        // unchanged, check if it should have been changed
        T listItem = getTableView().getItems().get(getIndex());
        // update if not same
        if (oldItem != listItem) {
            // doesn't help much because itemProperty doesn't fire
            // so we need the help of the skin: it must listen
            // to invalidation and force an update if 
            // its super wouldn't get a changeEvent
            updateItem(listItem, isEmpty());
        }
    }


    @Override
    protected Skin<?> createDefaultSkin() {
        return new TableRowSkinX<>(this);
    }


    public static class TableRowSkinX<T> extends TableRowSkin<T> {

        private WeakReference<T> oldItemRef;
        private InvalidationListener itemInvalidationListener;
        private WeakInvalidationListener weakItemInvalidationListener;
        /**
         * @param tableRow
         */
        public TableRowSkinX(TableRow<T> tableRow) {
            super(tableRow);
            oldItemRef = new WeakReference<>(tableRow.getItem());
            itemInvalidationListener = o -> {
                T newItem = ((ObservableValue<T>) o).getValue();
                T oldItem = oldItemRef != null ? oldItemRef.get() : null;
                oldItemRef = new WeakReference<>(newItem);
                if (oldItem != null && newItem != null && oldItem.equals(newItem)) {
                    forceCellUpdate();
                }
            };
            weakItemInvalidationListener = new WeakInvalidationListener(itemInvalidationListener);
            tableRow.itemProperty().addListener(weakItemInvalidationListener);
        }

        /**
         * Try to force cell update for equal (but not same) items.
         * C&P'ed code from TableRowSkinBase.
         */
        private void forceCellUpdate() {
            updateCells = true;
            getSkinnable().requestLayout();

            // update the index of all children cells (RT-29849).
            // Note that we do this after the TableRow item has been updated,
            // rather than when the TableRow index has changed (as this will be
            // before the row has updated its item). This will result in the
            // issue highlighted in RT-33602, where the table cell had the correct
            // item whilst the row had the old item.
            final int newIndex = getSkinnable().getIndex();
            for (int i = 0, max = cells.size(); i < max; i++) {
                cells.get(i).updateIndex(newIndex);
            }
       }

    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger
            .getLogger(IdentityCheckingListCell.class.getName());

}

 // usage
 table.setRowFactory(p -> new IdentityCheckingTableRow());

Обратите внимание, что TableCell имеет аналогичную жестко проверенную проверку на равенство, поэтому, если пользовательской строки недостаточно, может потребоваться использование настраиваемого TableCell с аналогичным обходным решением (хотя не сталкивайтесь с примером, где это необходимо)

3
kleopatra

Я полагаю этот поток имеет очень хорошее описание проблемы с обновлением таблицы.

2
Alex

Решение пользователя user1236048 является правильным, но ключевой момент не вызван. В ваших классах POJO, используемых для наблюдаемого списка таблицы, вы должны не только устанавливать методы getter и setter, но и новый, называемый Property. В руководстве по просмотру таблиц Oracle ( http://docs.Oracle.com/javafx/2/ui_controls/table-view.htm ) они оставили эту ключевую часть отключенной!

Вот как должен выглядеть класс Person:

public static class Person {

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    private Person(String fName, String lName, String email) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String fName) {
        firstName.set(fName);
    }

    public SimpleStringProperty firstNameProperty(){
        return firstName;
    }

    public String getLastName() {
        return lastName.get();
    }

    public void setLastName(String fName) {
        lastName.set(fName);
    }

    public SimpleStringProperty lastNameProperty(){
        return lastName;
    }

    public String getEmail() {
        return email.get();
    }

    public void setEmail(String fName) {
        email.set(fName);
    }

    public SimpleStringProperty emailProperty(){
            return email;
        }

}

1
Kevin Reynolds

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

Я сообщил об этом также в задании Jira: https://javafx-jira.kenai.com/browse/RT-22463

 public <T> void tableItemsRefresh(final ObservableList<T> items) {

      if (items == null || items.size() == 0)
         return;

      int idx = items.size() -1;
      final T item = items.get(idx);
      items.remove(idx);

      new Timer().schedule(new TimerTask() {
         @Override
         public void run() {
            Platform.runLater(new Runnable() {
               @Override
               public void run() {
                  items.add(item);
               }
            });
         }
      }, 100);
   } 
1
Andreas Niemeyer

Посмотрите на эту проблему в Jira: https://bugs.openjdk.Java.net/browse/JDK-8098085

комментарий 2012-09-20 08:50 дал обходной путь, который работает.

//wierd JavaFX bug
reseller_table.setItems(null); 
reseller_table.layout(); 

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
1
Andrei Krasutski

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

public static <T,U> void refreshTableView(final TableView<T> tableView, final List<TableColumn<T,U>> columns, final List<T> rows) {

    tableView.getColumns().clear();
    tableView.getColumns().addAll(columns);

    ObservableList<T> list = FXCollections.observableArrayList(rows);
    tableView.setItems(list);
}


Пример использования:

refreshTableView(myTableView, Arrays.asList(col1, col2, col3), rows);
1
ceklock

Вместо того, чтобы обновлять вручную, вы должны использовать наблюдаемые свойства . Ответы на этот вопрос иллюстрируют цель: SimpleStringProperty и SimpleIntegerProperty TableView JavaFX

1
Andreas

На основании ответа Даниэля Леона 

public static void refresh_table(TableView table)
{
        for (int i = 0; i < table.getColumns().size(); i++) {
    ((TableColumn)(table.getColumns().get(i))).setVisible(false);
    ((TableColumn)(table.getColumns().get(i))).setVisible(true);
    }
}
1
Phloo

JavaFX8

Я добавляю новый элемент с помощью DialogBox. Вот мой код.

ObservableList<Area> area = FXCollections.observableArrayList();

При инициализации () или setApp ()

this.areaTable.setItems(getAreaData());

getAreaData ()

private ObservableList<Area> getAreaData() {
    try {
        area = AreaDAO.searchEmployees(); // To inform ObservableList
        return area;
    } catch (ClassNotFoundException | SQLException e) {
        System.out.println("Error: " + e);
        return null;
    }
}

Добавить по диалоговому окну.

@FXML
private void handleNewArea() {
    Area tempArea = new Area();
    boolean okClicked = showAreaDialog(tempArea);
    if (okClicked) {
        addNewArea(tempArea);
        this.area.add(tempArea); // To inform ObservableList
    }

}

Area - это обычный JavaFX POJO . Надеюсь, это кому-нибудь поможет. 

1
Sudhakar Krishnan

Что за ошибка! Вот еще один обходной путь ...

public void forceRefresh() {
  final TableColumn< Prospect, ? > firstColumn = view.getColumns().get( 0 );
  firstColumn.setVisible( false );
  new Timer().schedule( new TimerTask() { @Override public void run() {
     Platform.runLater( new Runnable() { @Override public void run() {
        firstColumn.setVisible( true  ); }});
     }}, 100 );
}

Я сделал SSCCE to показать ошибку . Я призываю всех исправить это другим, более элегантным способом, потому что мой обходной путь очень уродлив!

1
Aubin

Та же самая проблема здесь, я попробовал некоторые решения, и лучшее для меня следующее:

В методе initialize контроллера создайте пустой observableList и установите его в таблице:

    obsBericht = FXCollections.observableList(new ArrayList<Bericht>(0));
    tblBericht.setItems(obsBericht);

В вашем методе обновления просто используйте observableList, очистите его и добавьте обновленные данные:

        obsBericht.clear();
        obsBericht.addAll(FXCollections.observableList(DatabaseHelper.getBerichte()));
//      tblBericht.setItems(obsBericht);

Нет необходимости снова устанавливать элементы таблицы

0
Tom

Я не уверен, относится ли это к вашей ситуации, но я опубликую то, что сработало для меня.

Я меняю свое табличное представление на основе запросов/поисков в базе данных. Например, таблица базы данных содержит данные пациента. Мое начальное представление таблицы в моей программе содержит всех пациентов. Затем я могу выполнить поиск запроса для пациентов по имени и фамилии. Я использую результаты этого запроса, чтобы пополнить свой список наблюдаемых. Затем я сбрасываю элементы в табличном представлении, вызывая tableview.setItems (observableList):

/**
 * Searches the table for an existing Patient.
 */
@FXML
public void handleSearch() {
    String fname = this.fNameSearch.getText();
    String lname = this.lNameSearch.getText();
    LocalDate bdate = this.bDateSearch.getValue();

    if (this.nameAndDOBSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(fname, lname, bdate);
    } else if (this.birthDateSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(bdate);
    } else if (this.nameSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(fname, lname);
    }

    this.patientTable.setItems(this.patientData);
}

Блоки if обновляют ObservableList с результатами запроса.

0
user2951579

Мое решение похоже на обходной путь Даниэль Де Леон , но оно также работает, когда вам нужно скрыть первый столбец (индекс 0 в его примере). Конечно, вы можете просто изменить индекс в его решении, но если вы переставляете столбцы, моё решение может работать лучше для вас. Идея состоит в том, чтобы скрыть и показать столбец по имени, а не скрывать и показывать его по индексу: 

private void updateMyTableView() {
    // update table view WORKAROUND !!!
    if (myTableView != null) {
        ObservableList<TableColumn<Entry, ?>> columns = myTableView.getColumns();
        for (TableColumn<Entry, ?> column : columns) {
            // at this point, we look for the specific column, which should
            // always be visible
            // therefore we use the "Column Title" String, e.g. "First name"
            if (column.getText().equals("Column Title")) {
                column.setVisible(false);
                column.setVisible(true);
            }
        }
    }
}

Лучше всего обновить таблицу в ветке обновления пользовательского интерфейса. Однако он также работает, просто вызывая updateMyTableView(); после того, как вы что-то изменили в своей таблице, поскольку JavaFX, похоже, обновляется в потоке пользовательского интерфейса в любом случае (не уверен в этом).

Platform.runLater(new Runnable() {
    public void run() {
         updateMyTableView();
    }
});
0
Michael

метод initialize ()

fullNameColumn = new TableColumn("Full name");
fullNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("fullName"));
usernameColumn = new TableColumn("Username");
usernameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("test"));
emailColumn = new TableColumn("Email");
emailColumn.setCellValueFactory(new PropertyValueFactory<User, String>("email"));
reseller_table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
reseller_table.getColumns().addAll(usernameColumn, fullNameColumn, emailColumn);

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);

Пользовательский класс (Hibernate POJO Class)

private SimpleStringProperty test;

public void setFullName(String fullName) {
  this.fullName = fullName;
  this.test = new SimpleStringProperty(fullName);    
}

public SimpleStringProperty testProperty() {
  return test;
}

метод refresh ()

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
0
user1236048

Я знаю, что этому вопросу 4 года, но у меня та же проблема, я пробовал решения сверху и не работал. Я также вызвал метод refresh (), но все еще не ожидаемый результат. Поэтому я выложу здесь мое решение, может быть, кому-то поможет.

Question db = center.getSelectionModel().getSelectedItem();
new QuestionCrud().deleteQ(db.getId());
ObservableList<Question> aftDelete = FXCollections.observableArrayList(
        (new QuestionCrud()).all()
        );
center.setItems(aftDelete);

Несмотря на то, что до этого я использовал другую переменную в ObeservableList для установки элементов в табличное представление, я называю это «грязным методом», но пока не получу лучшее решение, все в порядке.

0
Wolf Marian

После ответа Даниэля Де Леона ... 

  • Я ввел фиктивное свойство "modelChangedProperty" в моей модели и 
  • создал метод refresh () в моей модели, который изменяет значение этого свойства.
  • В моем контроллере я добавил Listener в свойство dummy, которое обновляет табличное представление. 

-

/**
 * Adds a listener to the modelChangedProperty to update the table view
 */
private void createUpdateWorkAroundListener() {

    model.modelChangedProperty.addListener(
            (ObservableValue<? extends Boolean> arg0, final Boolean oldValue, final Boolean newValue) -> updateTableView()
            );
}

/**
 * Work around to update table view
 */
private void updateTableView() {
    TableColumn<?, ?> firstColumn = scenarioTable.getColumns().get(0);
    firstColumn.setVisible(false);
    firstColumn.setVisible(true);
}
0
Stefan

Я пытался найти способ обновить tableView (ScalaFx) в течение 3-4 часов. Наконец я получил ответ. Я просто хочу опубликовать свое решение, потому что я потратил впустую уже несколько часов. 

-Для извлечения строк из базы данных я использовал для объявления метода, который возвращает ObservableBuffer.

Мой JDBC КЛАСС

    //To get all customer details
def getCustomerDetails : ObservableBuffer[Customer] = {

val customerDetails = new ObservableBuffer[Customer]()
  try {

    val resultSet = statement.executeQuery("SELECT * FROM MusteriBilgileri")

    while (resultSet.next()) {

      val musteriId = resultSet.getString("MusteriId")
      val musteriIsmi = resultSet.getString("MusteriIsmi")
      val urununTakildigiTarih = resultSet.getDate("UrununTakildigiTarih").toString
      val bakimTarihi = resultSet.getDate("BakimTarihi").toString
      val urununIsmi = resultSet.getString("UrununIsmi")
      val telNo = resultSet.getString("TelNo")
      val aciklama = resultSet.getString("Aciklama")

      customerDetails += new Customer(musteriId,musteriIsmi,urununTakildigiTarih,bakimTarihi,urununIsmi,telNo,aciklama)

    }
  } catch {
    case e => e.printStackTrace
  }

  customerDetails
}

-И я создал объект TableView. 

var table = new TableView[Customer](model.getCustomerDetails)
table.columns += (customerIdColumn,customerNameColumn,productInstallColumn,serviceDateColumn,
        productNameColumn,phoneNoColumn,detailColumn)

-И наконец я получил решение. В кнопку обновления, я вставил этот код; 

table.setItems(FXCollections.observableArrayList(model.getCustomerDetails.delegate))

модель является ссылкой на мой класс соединения JDBC

val model = new ScalaJdbcConnectSelect

Это коды скаляпа, но это дает некоторое представление о javafx

0
Muhammed Yalçın Kuru

Хорошо после поиска всех возможных решений. Сначала попытался очистить данные, а затем добавил в tableview tableView.getItems().clear();, что не решило мою проблему. Я перепробовал все ответы, приведенные здесь, но у меня ничего не вышло, и у меня все еще были устаревшие объекты в моей таблице, как показано на рисунке ниже:

 enter image description here

Чтобы исправить это, я создал метку DUMMY и использовал setGraphic следующим образом:

 enter image description here

0
Vishrant