65

我有这个常见的问题,因为它似乎是。重置后,我的表格视图不会刷新我的项目。我检查了数据,它是新的。

我从互联网尝试了多种解决方案,但没有成功。

无法重置所有列,因为它增加了一个空的一个额外的(不知道为什么)并且调整大小只是中断。

我的表不可编辑。新数据已更改。

如果我更改项目的顺序并且行更改(:|),则会刷新数据。

我只是没有想法。

目前刷新代码非常简单。

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

新数据再次正确。当我对 tableView 进行选择时,它会返回新的正确项目。

4

26 回答 26

63

解决方法:

 tableView.getColumns().get(0).setVisible(false);
 tableView.getColumns().get(0).setVisible(true);
于 2012-09-27T03:45:16.117 回答
62

由于JavaFX 8u60您可以使用(假设tableViewTableView类的一个实例):

tableView.refresh();

从文档中:

调用 refresh() 会强制 TableView 控件重新创建和重新填充填充控件视觉边界所需的单元格。换句话说,这会强制 TableView 更新它向用户显示的内容。这在底层数据源以 TableView 本身未观察到的方式发生更改的情况下很有用。

于 2016-09-23T22:37:13.157 回答
44

我在刷新时遇到了类似的问题。我的解决方案是将 上的操作限制为ObservableListbind().

假设ObservableList obsListTableView.

然后
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)
于 2012-10-04T22:56:46.543 回答
10

更新:
最后 tableview 刷新在JavaFX 8u60中得到解决,可用于早期访问。


关于刷新,请参阅Tableview 中的更新行
关于空白列,请参阅JavaFx 2 create TableView with single column。基本上它不是一个列,即您无法选择单击此空白列项目的项目。它只是一个样式像行的空白区域。


更新:如果您要通过更新 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);

几乎是等价的。所以我第一次用这个来填充表格,刷新表格时使用另一个。它仅用于演示目的。我已经在 J​​avaFX 2.1 中测试过代码。最后,您可以(并且应该)编辑您的问题,通过在您的问题的答案中移动代码片段来改进它。

于 2012-06-16T18:33:39.940 回答
6

我终于找到了一个丑陋的解决方法来刷新所有行。

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);
        }
    });
 }
于 2012-07-24T05:42:13.320 回答
3

oldItems.equals(newItems) 周围似乎有几个单独的问题

RT-22463的第一部分:即使调用 items.clear(),tableView 也不会更新

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

那是固定的。在设置新列表之前清除旧项目会清除所有旧状态,从而刷新表。这不起作用的任何示例都可能是回归。

仍然不起作用的是在没有先清除的情况下重新设置项目

// refresh table
table.setItems(listEqualToOld); 

如果表格显示的属性未涉及到项目的平等决定(参见RT-22463Aubin 中的示例)并且希望被RT-39094覆盖,那将是一个问题

更新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(虽然没有遇到需要这样做的示例)

于 2014-10-22T15:13:27.413 回答
2

我想这个线程对表刷新问题有很好的描述。

于 2012-09-22T23:55:00.473 回答
1

什么BUG!这是另一种解决方法...

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显示这个错误。我鼓励大家用另一种更优雅的方式来修复它,因为我的解决方法非常难看!

于 2013-07-25T19:52:22.110 回答
1

我有一个用例,Aubin 的解决方案没有其他帮助。我调整了该方法并通过删除项目并将其添加到表的项目列表中进行了更改,因为它最终仅在此 hack 中可靠,列可见切换仅在第一次完成这项工作。

我也在 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);
   } 
于 2013-08-23T09:23:51.880 回答
1

我遇到了同样的问题,经过一番搜索,这是我的解决方法。我发现如果列被删除然后重新添加,表就会更新。

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);
于 2013-09-04T00:05:55.583 回答
1

user1236048的解决方案是正确的,但关键点没有说出来。在用于表的可观察列表的 POJO 类中,您不仅需要设置 getter 和 setter 方法,还需要设置一个名为 Property 的新方法。在 Oracle 的 tableview 教程 ( 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;
        }

}

于 2014-06-12T22:24:46.140 回答
1

看看 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);
于 2016-04-04T14:46:05.513 回答
1

我一直试图找到一种方法来刷新 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))

model 是我的 jdbc 连接类的参考

val model = new ScalaJdbcConnectSelect

这是 scalafx 代码,但它为 javafx 提供了一些想法

于 2017-02-21T15:45:47.077 回答
1

JavaFX8

我正在通过对话框添加新项目。这是我的代码。

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

在 initialize() 或 setApp()

this.areaTable.setItems(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。希望这可以帮助某人。

于 2017-03-02T13:10:05.753 回答
0

初始化()方法

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 类)

private SimpleStringProperty test;

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

public SimpleStringProperty testProperty() {
  return test;
}

刷新()方法

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
于 2012-06-17T12:38:41.303 回答
0

您应该使用可观察的属性,而不是手动刷新。这个问题的答案示例目的: SimpleStringProperty and SimpleIntegerProperty TableView JavaFX

于 2014-07-04T12:30:06.593 回答
0

基于 Daniel De León 的回答

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);
    }
}
于 2014-07-15T20:51:58.870 回答
0

我的解决方案类似于Daniel De León的解决方法,但是当您需要隐藏第一列(在他的示例中为索引 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);
            }
        }
    }
}

最好在 UI 更新线程中更新您的表格。但是,它也可以通过updateMyTableView();在您更改表中的某些内容后调用,因为 JavaFX 似乎无论如何都会在 UI 线程中更新(不确定)。

Platform.runLater(new Runnable() {
    public void run() {
         updateMyTableView();
    }
});
于 2014-07-21T06:14:19.740 回答
0

我不确定这是否适用于您的情况,但我会发布对我有用的内容。

我根据对数据库的查询/搜索更改我的表视图。例如,数据库表包含患者数据。我程序中的初始表格视图包含所有患者。然后我可以按名字和姓氏搜索患者的查询。我使用这个查询的结果来重新填充我的 Observable 列表。然后我通过调用 tableview.setItems(observableList) 重置 tableview 中的项目:

/**
 * 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。

于 2014-11-30T18:06:42.873 回答
0

同样的问题,我尝试了一些解决方案,对我来说最好的解决方案如下:

在控制器的初始化方法中,创建一个空的 observableList 并将其设置到表中:

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

在您的更新方法中,只需使用 observableList,清除它并添加刷新的数据:

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

不需要重新设置表格的项目

于 2015-02-26T12:36:41.653 回答
0

按照丹尼尔·德莱昂的回答...

  • 我在我的模型中引入了一个虚拟属性“modelChangedProperty”并
  • 在我的模型中创建了一个方法 refresh() 来更改该属性的值。
  • 在我的控制器中,我向更新表视图的虚拟属性添加了一个侦听器。

-

/**
 * 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);
}
于 2015-04-09T11:40:19.343 回答
0

我知道这个问题已经 4 年了,但我有同样的问题,我尝试了上面的解决方案但没有奏效。我也调用了 refresh() 方法,但仍然不是我的预期结果。所以我在这里发布我的解决方案可能会对某人有所帮助。

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

即使在此之前,我在 ObeservableList 中使用了另一个变量来将项目设置到 tableview 中,我称之为“肮脏的方法”,但在我得到更好的解决方案之前是可以的。

于 2016-12-30T19:18:41.490 回答
0

为了刷新我的表,我这样做:

在名为RequisicionesController我的 ControllerA 中,我这样做

@FXML public TableView<Requisiciones>  reqtable;

public TableView<Requisiciones> getReqtable() {
    return reqtable;
}

public void setReqtable(TableView<Requisiciones> reqtable) {
    this.reqtable = reqtable;
}

在 FXML 加载器中,我得到了 ControllerB,他也命名为RevisionReqController

RevisionReqController updateReq = cargarevisionreq.<RevisionReqController>getController();

RequisicionesController.this.setReqtable(selecciondedatosreq());                  
updateReq.setGetmodeltable(RequisicionesController.this.getReqtable());

在我的 ControllerB 中,我这样做:

public TableView<Requisiciones>  getmodeltable;     

public TableView<Requisiciones> getGetmodeltable() {
    return getmodeltable;
}

public void setGetmodeltable(TableView<Requisiciones> getmodeltable) {
    this.getmodeltable = getmodeltable;
}

然后:

public void refresh () {
    mybutton.setonMouseClicked(e -> {
    ObservableList<Requisiciones> datostabla = FXCollections.observableArrayList();
    try {
        // rest of code

        String Query= " select..";

        PreparedStatement pss =Conexion.prepareStatement(Query);
        ResultSet rs = pss.executeQuery();
        while(rs.next()) {
            datostabla.add(new Requisiciones(
                // al requisiciones data
            ));
        }
        RevisionReqController.this.getGetmodeltable().getItems().clear();
        RevisionReqController.this.getGetmodeltable().setItems(datostabla);
    } catch(Exception ee) {
         //my message here
    }
}

所以在我的控制器中,我只是用 setCellValueFactory 加载表,这就是全部。

于 2019-11-14T05:12:05.067 回答
0

您只需要清除表格并调用生成表格填充的函数即可。

ButtonRefresh.setOnAction((event) -> {
            tacheTable.getItems().clear();
            PopulateTable();
        });
于 2020-02-08T22:03:42.837 回答
-1

在寻找所有可能的解决方案之后。尝试先清除数据,然后在 tableview 中添加,tableView.getItems().clear();但仍然没有解决我的问题。我尝试了这里给出的所有答案,但对我没有用,我的桌子上仍然有陈旧的对象,如下图所示:

在此处输入图像描述

为了修复它,我创建了一个 DUMMY 标签并使用setGraphic如下:

在此处输入图像描述

于 2018-04-26T21:28:59.020 回答
-11

我当时认为使用列绑定的更改表的方法绑定数据的方法,如果这是 FX 的 bug 那也激活了连接决断了,不应该拖到 Java8 解决了。</p>

跟踪JavaFX源代码后,并没有发现bug。利用Listener等方法观察也没有异样。尝试利用JFace中的PropertyChangeSupport方式也声明POJO内容变更没有效果。最后将DoubleProperty改为WritableObjectValue,问就解决了。</p>

                                                           解決於台灣台北

我已经确定使用更改 Column Visable Property 不符合数据绑定自动化目的。

在我跟踪 JavaFX TableView 源代码之后。我从未发现 Tableview 绑定问题的任何问题代码。4 周前,我将 POJO 字段的类型从 DoubleProperty 更改为 WritableObjectValue,问题解决了。

                                               resolve in Taiwan Taipei.

示例代码:</p>

public class CostAnalytics{
protected WritableObjectValue<Double> subtotal=new SimpleObjectProperty<Double>();//利用WritableObjectValue達到自動更新目的,不需要使用個別Column操作setVisable(false)及setVisable(true)
//...
public void setQuantity(double quantity) {
    this.pcs.firePropertyChange("quantity", this.quantity, quantity);
    this.quantity.set(quantity);
    this.calsSubtotal();
}
public WritableObjectValue<Double> getSubtotal() {//利用WritableObjectValue達到自動更新目的,不需要使用個別Column操作setVisable(false)及setVisable(true)
    return subtotal;
}
///...
}


TableColumn<CostAnalytics, Double> subtotal = new TableColumn<CostAnalytics, Double>(
            "小計");
subtotal.setCellValueFactory(new Callback<CellDataFeatures<CostAnalytics, Double>, ObservableValue<Double>>() {

        public ObservableValue<Double> call(
                CellDataFeatures<CostAnalytics, Double> p) {
            WritableObjectValue<Double> result = p.getValue().getSubtotal();// //利用WritableObjectValue達到自動更新目的,不需要使用個別Column操作setVisable(false)及setVisable(true)
            // return (ObservableValue<Double>)
            // result;//利用WritableObjectValue達到自動更新目的,不需要使用個別Column操作setVisable(false)及setVisable(true)
            // return new
            // ReadOnlyObjectWrapper<Double>(p.getValue().getSubtotal());//造成無法自動更新
            return (ObservableValue<Double>) p.getValue().getSubtotal();// 利用WritableObjectValue達到自動更新目的,不需要使用個別Column操作setVisable(false)及setVisable(true)
        }

    });
于 2015-05-31T08:35:21.393 回答