如何获得JavaFX TableView中的第一列值,就像JTable一样?

我希望得到第一列值,因为我们可以使用swing在Jtable中实现。 下面是我的jtable代码和图片。

String Table_Clicked = jTable1.getModel().getValueAt(row, 0).toString(); 

JTable中

正如你在图像中看到的那样,当我点击Name列值8时,它给出了第一列值,如8 。 但我选择名称列

那么如何使用TableView Componenet在JavaFX中实现这一点。

我从TableView中获取所选的值,如下图所示,其中包含代码。

  tableview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observableValue, Object oldValue, Object newValue) { if(tableview.getSelectionModel().getSelectedItem() != null) { TableViewSelectionModel selectionModel = tableview.getSelectionModel(); ObservableList selectedCells = selectionModel.getSelectedCells(); TablePosition tablePosition = (TablePosition) selectedCells.get(0); Object val = tablePosition.getTableColumn().getCellData(newValue); System.out.println("Selected value IS :" + val); } } }); 

TableView的JavaFX

所以我想在tableview中得到相同的第一列数据,因为我们可以在Jtable中获得? 所以如何获得NO值..因为使用我的上面的代码我得到选定的Cell的值, 这是在控制台中的八个打印..但我想得到第一列值..帮助我彻底前进。

谢谢..

更新TABLEVIEW的数据填充代码

  PreparedStatement psd = (PreparedStatement) conn.prepareStatement("SELECT No,name FROM FieldMaster"); psd.execute(); ResultSet rs = psd.getResultSet(); for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){ //We are using non property style for making dynamic table final int j = i; namecol = new TableColumn(rs.getMetaData().getColumnName(i+1)); namecol.setCellValueFactory(new Callback<CellDataFeatures, ObservableValue>() { @Override public ObservableValue call(CellDataFeatures param) { return new SimpleStringProperty(param.getValue().get(j).toString()); } }); tableview.getColumns().addAll(namecol); System.out.println("Column ["+i+"] "); } while(rs.next()) { //Iterate Row ObservableList row = FXCollections.observableArrayList(); for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) { //Iterate Column row.add(rs.getString(i)); } System.out.println("Row [1] added "+row ); data.add(row); } tableview.setItems(data); conn.close(); 

您可以通过调用与所选行对应的模型对象上的getter来检索相关字段。

在下面的代码中, newValue.getId()调用是关键。

没有Java 8 lambdas:

 final Label selected = new Label(); table.getSelectionModel().selectedItemProperty().addListener( new ChangeListener() { @Override public void changed( ObservableValue observable, IdentifiedName oldValue, IdentifiedName newValue ) { if (newValue == null) { selected.setText(""); return; } selected.setText("Selected Number: " + newValue.getId()); } } ); 

使用Java 8 lambda:

 final Label selected = new Label(); table.getSelectionModel().selectedItemProperty().addListener( (observable, oldValue, newValue) -> { if (newValue == null) { selected.setText(""); return; } selected.setText("Selected Number: " + newValue.getId()); } ); 

示例代码

选

 import javafx.application.Application; import javafx.collections.*; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.*; import javafx.stage.Stage; public class TableViewSample extends Application { private TableView table = new TableView<>(); private final ObservableList data = FXCollections.observableArrayList( new IdentifiedName(3, "three"), new IdentifiedName(4, "four"), new IdentifiedName(7, "seven"), new IdentifiedName(8, "eight"), new IdentifiedName(9, "nineses") ); public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { TableColumn idColumn = new TableColumn<>("No"); idColumn.setMinWidth(100); idColumn.setCellValueFactory( new PropertyValueFactory<>("id") ); TableColumn nameColumn = new TableColumn<>("Name"); nameColumn.setMinWidth(100); nameColumn.setCellValueFactory( new PropertyValueFactory<>("name") ); table.setItems(data); table.getColumns().setAll(idColumn, nameColumn); table.setPrefHeight(180); final Label selected = new Label(); table.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { if (newValue == null) { selected.setText(""); return; } selected.setText("Selected Number: " + newValue.getId()); }); final VBox layout = new VBox(10); layout.setPadding(new Insets(10)); layout.getChildren().addAll(table, selected); VBox.setVgrow(table, Priority.ALWAYS); stage.setScene(new Scene(layout)); stage.show(); } public static class IdentifiedName { private final int id; private final String name; private IdentifiedName(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } } 

其他问题的答案

检查我更新的问题所以我不能用这个?

因此,在您的更新中,您可以看到每行数据的类型是ObservableList ,而在我的回答中,类型是IdentifiedName 。 要使发布的解决方案适用于您的数据类型,更改是微不足道的。 newValue.getId()的等价物将是newValue.get(0) ,以返回列表中所选行的第一个项目。

 final Label selected = new Label(); table.getSelectionModel().selectedItemProperty().addListener( (observable, oldValue, newValue) -> { if (newValue == null) { selected.setText(""); return; } selected.setText("Selected Number: " + newValue.get(0)); } ); 

或者是否可以使用identifyname类? 那怎么样?

是的,你可以,但你必须对数据库提取代码进行大量更改,以便将创建的数据加载到IdentifiedName类而不是ObservableList ,这样做会失去数据库加载代码的通用性质。

我将你的代码实现到我得到的项目中… java.lang.ClassCastException:

您需要为数据类型正确设置表和列的类型,而不是我为用例提供的示例类型。

替换这些类型:

 TableView TableColumn 

有这些类型:

 TableView> TableColumn, String> 

小建议

我建议通过阅读Java Generics Trail来进行复习。 JavaFX中的表在使用generics时非常复杂,但在表代码中使用正确的generics可以使编写更容易(只要您使用的是一个善于在需要时猜测generics的IDE)。

您也可能希望提供一个最小的,完整的,经过测试和可读的示例 ,以及此类型的未来问题(并非所有问题)。 构建一个可以帮助您更快地解决您的问题。 此外,确保您的代码具有一致的缩进使其更容易阅读。

您必须查看底层的ObservableList 。 适合我的代码是:

 tableView.getItems().get(tableView.getSelectionModel().getSelectedIndex()) 

在我的测试中,它返回一个必须包含get()方法的Person对象(我写的POJO get()

我可以使用下面的代码获得第一列值:

 tableview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observableValue, Object oldValue, Object newValue) { //Check whether item is selected and set value of selected item to Label if (tableview.getSelectionModel().getSelectedItem() != null) { TableView.TableViewSelectionModel selectionModel = tableview.getSelectionModel(); ObservableList selectedCells = selectionModel.getSelectedCells(); TablePosition tablePosition = (TablePosition) selectedCells.get(0); tablePosition.getTableView().getSelectionModel().getTableView().getId(); //gives you selected cell value.. Object GetSinglevalue = tablePosition.getTableColumn().getCellData(newValue); getbothvalue = tableview.getSelectionModel().getSelectedItem().toString(); //gives you first column value.. Finalvaluetablerow = getbothvalue.toString().split(",")[0].substring(1); System.out.println("The First column value of row.." + Finalvaluetablerow); } } }); 

谢谢..