我想得到第一列值,因为我们可以在Jtable中使用swing实现。下面是我的jtable代码和图像。
String Table_Clicked = jTable1.getModel().getValueAt(row, 0).toString();
如图所示,当我单击名称列值8时,它会给我第一列值,如8。但我选择名称列
那么,如何在JavaFX中使用TableView组件实现这一点呢。
我从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中的第一列数据与Jtable中的数据相同?那么,怎样才能让它毫无价值呢。。使用我上面的代码,我在控制台中得到所选单元格的值,即8打印。。但我想得到第一列的值。。帮我把事情搞清楚。
谢谢
更新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<ObservableList, String>, ObservableValue<String>>()
{
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param)
{
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
tableview.getColumns().addAll(namecol);
System.out.println("Column ["+i+"] ");
}
while(rs.next())
{
//Iterate Row
ObservableList<String> 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();
我可以使用以下代码获得第一列值:
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);
}
}
});
谢谢
您必须查看底层的可观察列表
。对我有效的代码是:
tableView.getItems().get(tableView.getSelectionModel().getSelectedIndex())
在我的测试中,它返回一个Person
对象(我编写的POJO),该对象必须包含一个get()
方法。
解决方案
可以通过调用与所选行对应的模型对象上的getter来检索相关字段。
在newValue下面的代码中。getId()
调用是关键。
没有Java 8 lambdas:
final Label selected = new Label();
table.getSelectionModel().selectedItemProperty().addListener(
new ChangeListener<IdentifiedName>() {
@Override
public void changed(
ObservableValue<? extends IdentifiedName> observable,
IdentifiedName oldValue,
IdentifiedName newValue
) {
if (newValue == null) {
selected.setText("");
return;
}
selected.setText("Selected Number: " + newValue.getId());
}
}
);
使用Java 8 lambdas:
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<IdentifiedName> table = new TableView<>();
private final ObservableList<IdentifiedName> 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<IdentifiedName, Integer> idColumn = new TableColumn<>("No");
idColumn.setMinWidth(100);
idColumn.setCellValueFactory(
new PropertyValueFactory<>("id")
);
TableColumn<IdentifiedName, String> 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
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));
}
);
或者可以使用identifiedname类吗?那怎么办?
可以,但必须对数据库获取代码进行大量更改,才能将创建的数据加载到
IdentifiedName
类中,而不是ObservableList中
我在我的项目中实现了你的代码<代码>java。lang.ClassCastException:
您需要为数据类型正确设置表和列的类型,而不是我为用例提供的示例类型。
替换这些类型:
TableView<IdentifiedName>
TableColumn<IdentifiedName, Integer>
有了这些类型:
TableView<ObservableList<String>>
TableColumn<ObservableList<String>, String>
小建议
我建议通过阅读Java泛型线索进行复习。JavaFX中的表在泛型的使用上相当复杂,但是在表代码中使用正确的泛型可以使编写变得更容易(只要您使用的是一个好的IDE,它在需要时能够很好地猜测泛型)。
您还可能希望提供一个最小的、完整的、经过测试的和可阅读的示例,以及这种类型的未来问题(不是所有问题)。构建一个可以帮助你更快地解决问题。此外,确保代码具有一致的缩进可以使其更容易阅读。
问题内容: 我如何获得年度的当前星期数,例如PHP的星期数? 它应该是ISO-8601的 星期数,从星期一开始的星期数。 问题答案: 在观察夏令时和1月1日是星期五的年份中,日期存在问题。通过使用所有UTC方法进行修复。以下代码将相同的结果返回给Moment.js。 创建“ UTC”日期时,小时为零。 最小化的原型版本(仅返回星期数): 测试部分 在本部分中,您可以输入YYYY-MM-DD格式的任
我有一个Java Swing Jlist,我知道如何处理在“选定项”上的左键单击和右键单击,但这里我的问题是:如果项1当前被选中,但当我右键单击项3时,如何获得该项的信息/标识?例如,如下图所示,
问题内容: 我正在尝试在连接到数据库的jtable上使用update方法,并希望根据用户单击的行来填写表单上的文本字段。我知道我将需要一个getValueAt()方法,但是我不确定如何根据用户单击的行来填充哪一行。我无法在Google上找到任何内容,因此任何信息都将对您有所帮助! 问题答案: 您将需要调用表模型的getValueAt()来获取所需的值。您还将在表上需要一个侦听器来侦听选择。这样,一
问题内容: 文字为: 我只想得到 我试过了 : 但这给了我: 问题答案: 正则表达式是不必要的。只需使用或即可。
我正在建立汽车生日愿望项目。到目前为止,我已经设法循环了一个月 csv文件包含以下信息
我正在做一个项目,由于缺乏知识而受阻。代码是有效的,但我不知道3号网站是否认为它是被人点击的。 让我解释一下: 我一共有3个网站。 当点击按钮时,网站1重定向到网站2。 网站2检查推荐人是否来自网站1,并自动重定向到网站3。 我需要重定向(网站2- 迄今为止的代码: 我需要的最后一部分,使重定向(网站2)- 网站3检查裁判和所有的东西,发现这是一个人点击