JavaFX:TableView 行选择

Mal*_*kri 0 java javafx tableview

我第一次从事 java/Javafx 项目,我有一个TableView(姓名、名字、年龄...)来呈现我的数据,我需要用户能够选择一行我每次有关此人(其他列)的所有信息,即使他单击另一列,但我一直无法找到正确的方法来做到这一点。当我选择一行时,我的代码每次都会给出我单击的单元格的值,但我需要其他信息在我的 SQLite 数据库中搜索并对其进行处理(删除/编辑此人..)

这是我使用的代码:

...//rest of code

@Override
public void initialize(URL location, ResourceBundle resources) {

private TableView<Student> tbl_elev=new TableView<Student>();

...

tbl_elev.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
            @Override
            public void changed(ObservableValue<?> observableValue, Object oldValue, Object newValue) {
                //Check whether item is selected and set value of selected item to Label
                if (tbl_elev.getSelectionModel().getSelectedItem() != null) {
                    TableViewSelectionModel<Student> selectionModel = tbl_elev.getSelectionModel();
                    ObservableList<?> selectedCells = selectionModel.getSelectedCells();
                    @SuppressWarnings("unchecked")
                    TablePosition<Object, ?> tablePosition = (TablePosition<Object, ?>) selectedCells.get(0);
                    Object val = tablePosition.getTableColumn().getCellData(newValue);
                    System.out.println("Selected Value " + val);
                }
            }
            });
}

... //rest of code
Run Code Online (Sandbox Code Playgroud)

我正在等待您的建议和想法,我不介意您是否建议另一种方法,因为这可能不兼容(取自互联网)如果您需要代码的任何其他部分,请发表评论,我不会全部添加,因为它是太长了,无法阅读..(抱歉我的英语不好)

Jon*_*cka 5

如果您指定 ChangeListener 参数的类型为 Student,则可以使用该对象的实例方法:

这是一个最小、完整且可验证的示例

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SSCCE extends Application {

    @Override
    public void start(Stage stage) {

        VBox root = new VBox();

        TableView<Student> studentsTable = new TableView<Student>();

        HBox studentBox = new HBox();
        Label studentHeader = new Label("Student: ");
        Label studentInfo = new Label("");
        studentBox.getChildren().addAll(studentHeader, studentInfo);

        root.getChildren().addAll(studentsTable, studentBox);

        // Prepare the columns
        TableColumn<Student, String> firstNameCol = new TableColumn<Student, String>(
                "First name");
        firstNameCol.setCellValueFactory(cellData -> cellData.getValue()
                .firstNameProperty());

        TableColumn<Student, String> lastNameCol = new TableColumn<Student, String>(
                "Last name");
        lastNameCol.setCellValueFactory(cellData -> cellData.getValue()
                .lastNameProperty());

        studentsTable.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener<Student>() {

                    // Here's the key part. See how I specify that the
                    // parameters are of type student. Now you can use the
                    // instance methods from Student.
                    @Override
                    public void changed(
                            ObservableValue<? extends Student> observable,
                            Student oldValue, Student newValue ) {

                        studentInfo.setText(newValue.getFirstName() + " "
                                + newValue.getLastName());
                        // If you want to get the value of a selected student cell at
                        // anytime, even if it hasn't changed. Just do e.g.
                        // studentsTable.getSelectionModel().getSelectedItem().getFirstName()
                    }
                });

        studentsTable.getColumns().setAll(firstNameCol, lastNameCol);

        // Some mock Student objects
        Student student1 = new Student("Eric", "Smith");
        Student student2 = new Student("Brad", "Jones");
        Student student3 = new Student("Logan", "Thorpe");

        // Fill the table with students.
        studentsTable.getItems().addAll(student1, student2, student3);

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

    // The student class. In this case an inner class to simplify the example. But generally you should never use inner classes.
    class Student {

        private StringProperty firstName;
        private StringProperty lastName;

        public Student(String firstName, String lastName) {
            this.firstName = new SimpleStringProperty(firstName);
            this.lastName = new SimpleStringProperty(lastName);
        }

        public String getFirstName() {
            return firstName.get();
        }

        public void setFirstName(String firstName) {
            this.firstName.set(firstName);
        }

        public StringProperty firstNameProperty() {
            return firstName;
        }

        public String getLastName() {
            return lastName.get();
        }

        public void setLastName(String lastName) {
            this.lastName.set(lastName);
        }

        public StringProperty lastNameProperty() {
            return lastName;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)