Jav*_*Man 1 java swing javafx tableview javafx-2
我希望得到第一列值,因为我们可以使用swing在Jtable中实现.下面是我的jtable代码和图片.
String Table_Clicked = jTable1.getModel().getValueAt(row, 0).toString();
Run Code Online (Sandbox Code Playgroud)

正如您在图像中看到的那样,当我单击" 名称"列值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);
}
}
});
Run Code Online (Sandbox Code Playgroud)

所以我想在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<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();
Run Code Online (Sandbox Code Playgroud)
解
您可以通过调用与所选行对应的模型对象上的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());
}
}
);
Run Code Online (Sandbox Code Playgroud)
使用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());
}
);
Run Code Online (Sandbox Code Playgroud)
示例代码

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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他问题的答案
检查我更新的问题所以我不能用这个?
因此,在您的更新中,您可以看到每行数据ObservableList<String>的类型,而在我的答案中,类型是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));
}
);
Run Code Online (Sandbox Code Playgroud)
或者是否可以使用identifyname类?那怎么样?
是的,你可以,但你必须对你的数据库提取代码进行大量更改,以便将创建的数据加载到IdentifiedName类中而不是ObservableList<String>这样做,这样做会失去数据库加载代码的通用性质.
我将你的代码实现到我的项目中......
java.lang.ClassCastException:
您需要为数据类型正确设置表和列的类型,而不是我为用例提供的示例类型.
替换这些类型:
TableView<IdentifiedName>
TableColumn<IdentifiedName, Integer>
Run Code Online (Sandbox Code Playgroud)
有这些类型:
TableView<ObservableList<String>>
TableColumn<ObservableList<String>, String>
Run Code Online (Sandbox Code Playgroud)
小建议
我建议通过阅读Java Generics Trail来进行复习.JavaFX中的表在使用泛型时非常复杂,但在表代码中使用正确的泛型可以使编写更容易(只要您使用的是一个善于在需要时猜测泛型的IDE).
您还可能希望提供一个最小的,完整的,经过测试和可读的示例,以及此类型的未来问题(并非所有问题).构建一个可以帮助您更快地解决您的问题.此外,确保您的代码具有一致的缩进使其更容易阅读.
| 归档时间: |
|
| 查看次数: |
8135 次 |
| 最近记录: |