Javafx 如何完全重置tableview以在同一tableview中显示不同结构的数据?

Javafx 如何完全重置tableview以在同一tableview中显示不同结构的数据?,javafx,Javafx,我正在编写一个JavaFX应用程序来处理PostgreSQL数据库(SQL查询、可视化数据库对象)。应用程序的一部分是一个tableview,它显示SQL查询的结果 用查询结果填充tableview的代码是基于第一个查询的,并且在第一个查询中工作正常;查询的每个属性都有一列,数据显示在表格单元格中 我的问题是,tableview将后续查询的列附加到先前查询的现有列的右侧;该表按列向右侧增长 我试图通过调用(tableview.getColumns().removeAll())删除现有列,但没有成

我正在编写一个JavaFX应用程序来处理PostgreSQL数据库(SQL查询、可视化数据库对象)。应用程序的一部分是一个tableview,它显示SQL查询的结果

用查询结果填充tableview的代码是基于第一个查询的,并且在第一个查询中工作正常;查询的每个属性都有一列,数据显示在表格单元格中

我的问题是,tableview将后续查询的列附加到先前查询的现有列的右侧;该表按列向右侧增长

我试图通过调用(
tableview.getColumns().removeAll()
)删除现有列,但没有成功,但是这些列没有从表中删除。调用tableviews
refresh()
方法也没有效果

例如:

问题1:

选择姓名、性别
从个人
限制10;
问题2:

选择标题、年份
从生产
限制3;
在这两个查询之后,my tableview的内容:

name | sex | title             | year
-------------------------------------
     |     | Paris Pursuit     | 1960
     |     | Call Out the kids | 1960
     |     | No Bong Bongos    | 1960
我在这里监督什么吗


编辑:将removeAllColumns()改为removeAllColumns()

kleopatra的假设确实正确。我误解了
removeAll()
的用法,并假设它会清除列表,而该方法只删除作为参数传递的列。使用
list.add()
在for循环中添加新列,而不是将它们收集到一个列表中,然后使用
setAll()
添加它们,这无疑是一种侮辱

谢谢你让我走上正轨,克利奥帕特拉

sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>

<SplitPane dividerPositions="0.9" maxHeight="400.0" maxWidth="600.0" minHeight="400.0" minWidth="600.0" orientation="VERTICAL" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
  <items>
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
         <children>
            <ScrollPane layoutX="60.0" layoutY="52.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
               <content>
                  <AnchorPane maxHeight="360.0" maxWidth="600.0" minHeight="360.0" minWidth="600.0" prefHeight="360.0" prefWidth="600.0">
                     <children>
                        <TableView fx:id="dataTable" layoutX="14.0" layoutY="14.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
                     </children>
                  </AnchorPane>
               </content>
            </ScrollPane>
         </children></AnchorPane>
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
         <children>
            <Button fx:id="regenerateButton" layoutX="255.0" layoutY="5.0" mnemonicParsing="false" onAction="#regenerateData" text="Regenerate" />
         </children></AnchorPane>
  </items>
</SplitPane>
Controller.java

包装样品;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.value.observeValue;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.fxml.fxml;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.util.Callback;
导入java.util.ArrayList;
导入java.util.Random;
导入java.util.UUID;
公共类控制器{
@FXML
私有表视图数据表;
@FXML
公共数据(){
Random rand=新的Random();
int columnCount=rand.nextInt(50);
int rowCount=rand.nextInt(300);
ObservableList tableData=FXCollections.observableArrayList();
ArrayList columns=新的ArrayList();
对于(int i=0;i
不要发明api(getColumns().removeAllColumns()不存在,甚至不会编译),也不要随机应用现有api。。。只需阅读并理解api文档并应用适当的内容:)提示:查看table.getColumns返回的类型,阅读该类(及其祖先)的api文档以了解如何删除包含的所有内容。顺便说一句:tableview将后续查询的列附加到现有列的右侧是错误的-这是您的代码(您没有显示:)确实如此,很可能是通过call list.add(vs.f.i.list.setAll)好的,但是您没有显示的代码中有错误;)请提供一个例子来说明问题。
removeAllColumns()
对我来说是一个粗心的错误,我的意思是
removeAll
。你的假设是正确的;我通过
列表添加列。在for循环中添加
<代码>列表。setAll
导致所需的行为。稍后我将提供mre。