尝试使 Tableview 可点击时出现 JavaFX 错误

标签 java javafx

我正在尝试使 tableview 可单击,它将返回单击的单元格中的文本。尝试在 Netbeans 中编译时收到两个错误。所有代码均取自“示例 12-11:单元格编辑的替代解决方案”official tableview tutorial & from this stackoverflow.com answer .以下是错误:

  • 类型参数 MouseEvent 不在类型变量 T 的范围内
    cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler() {
    其中 T 是一个类型变量:
    T 扩展接口(interface) EventHandler 中声明的事件
  • 类 Node 中的方法 addEventFilter 不能应用于给定类型;
    cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler() {
    必需:事件类型,事件处理程序
    找到:int,>
    原因:不存在类型变量 T 的实例,因此参数类型 int 符合形式参数类型 EventType
    其中 T 是一个类型变量:
    T 扩展方法 addEventFilter(EventType,EventHandler) 中声明的事件

  • import java.awt.event.MouseEvent;
    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellEditEvent;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    
    public class TableViewSample extends Application {
    
         private TableView<Person> table = new TableView<>();
         private final ObservableList<Person> data =
                FXCollections.observableArrayList(
                new Person("Jacob", "Smith", "jacob.smith@example.com"),
                new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                new Person("Ethan", "Williams", "ethan.williams@example.com"),
                new Person("Emma", "Jones", "emma.jones@example.com"),
                new Person("Michael", "Brown", "michael.brown@example.com"));
         final HBox hb = new HBox();
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) {
            Scene scene = new Scene(new Group());
            stage.setTitle("Table View Sample");
            stage.setWidth(450);
            stage.setHeight(550);
    
            final Label label = new Label("Address Book");
            label.setFont(new Font("Arial", 20));
    
        table.setEditable(false);
            Callback<TableColumn, TableCell> cellFactory =
                new Callback<TableColumn, TableCell>() {
                    public TableCell call(TableColumn p) {
                        TableCell cell = new TableCell<Person, String>() {
                            @Override
                            public void updateItem(String item, boolean empty) {
                                super.updateItem(item, empty);
                                setText(empty ? null : getString());
                                setGraphic(null);
                            }
    
                            private String getString() {
                                return getItem() == null ? "" : getItem().toString();
                            }
                        };
    
                    cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()      {
                        @Override
                        public void handle(MouseEvent event) {
                            if (event.getClickCount() > 1) {
                                System.out.println("double clicked!");
                                TableCell c = (TableCell) event.getSource();
                                System.out.println("Cell text: " + c.getText());
                            }
                        }
                    });
                    return cell;
                }
            };
    
            TableColumn firstNameCol = new TableColumn("First Name");
            firstNameCol.setMinWidth(100);
            firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));
            firstNameCol.setCellFactory(cellFactory);
            firstNameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())
                            ).setFirstName(t.getNewValue());
                    }
                 }
            );
    
    
            TableColumn lastNameCol = new TableColumn("Last Name");
            lastNameCol.setMinWidth(100);
            lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));
            lastNameCol.setCellFactory(cellFactory);
            lastNameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())
                            ).setLastName(t.getNewValue());
                    }
                }
            );
    
            TableColumn emailCol = new TableColumn("Email");
            emailCol.setMinWidth(200);
            emailCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));
            emailCol.setCellFactory(cellFactory);
            emailCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())
                            ).setEmail(t.getNewValue());
                    }
                }
            );
    
            table.setItems(data);
            table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
    
            final TextField addFirstName = new TextField();
            addFirstName.setPromptText("First Name");
            addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
            final TextField addLastName = new TextField();
            addLastName.setMaxWidth(lastNameCol.getPrefWidth());
            addLastName.setPromptText("Last Name");
            final TextField addEmail = new TextField();
            addEmail.setMaxWidth(emailCol.getPrefWidth());
            addEmail.setPromptText("Email");
    
            final Button addButton = new Button("Add");
            addButton.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent e) {
                    data.add(new Person(
                            addFirstName.getText(),
                            addLastName.getText(),
                            addEmail.getText()));
                    addFirstName.clear();
                    addLastName.clear();
                    addEmail.clear();
                }
            });
    
            hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
            hb.setSpacing(3);
    
            final VBox vbox = new VBox();
            vbox.setSpacing(5);
            vbox.setPadding(new Insets(10, 0, 0, 10));
            vbox.getChildren().addAll(label, table, hb);
    
            ((Group) scene.getRoot()).getChildren().addAll(vbox);
    
            stage.setScene(scene);
            stage.show();
        }
    
        public static class Person {
    
            private final SimpleStringProperty firstName;
            private final SimpleStringProperty lastName;
            private final SimpleStringProperty email;
    
            private Person(String fName, String lName, String email) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
                this.email = new SimpleStringProperty(email);
            }
    
            public String getFirstName() {
                return firstName.get();
            }
    
            public void setFirstName(String fName) {
                firstName.set(fName);
            }
    
            public String getLastName() {
                return lastName.get();
            }
    
            public void setLastName(String fName) {
                lastName.set(fName);
            }
    
            public String getEmail() {
                return email.get();
            }
    
            public void setEmail(String fName) {
                email.set(fName);
            }
        }
    
        class EditingCell extends TableCell<Person, String> {
    
            private TextField textField;
    
            public EditingCell() {
            }
    
            @Override
            public void startEdit() {
                if (!isEmpty()) {
                    super.startEdit();
                    createTextField();
                    setText(null);
                    setGraphic(textField);
                    textField.selectAll();
                }
            }
    
            @Override
            public void cancelEdit() {
                super.cancelEdit();
    
                setText((String) getItem());
                setGraphic(null);
            }
    
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
    
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    if (isEditing()) {
                        if (textField != null) {
                            textField.setText(getString());
                        }
                        setText(null);
                        setGraphic(textField);
                    } else {
                        setText(getString());
                        setGraphic(null);
                    }
                }
            }
    
            private void createTextField() {
                textField = new TextField(getString());
                textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
                textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
                    @Override
                    public void changed(ObservableValue<? extends Boolean> arg0, 
                        Boolean arg1, Boolean arg2) {
                            if (!arg2) {
                                commitEdit(textField.getText());
                            }
                    }
                });
            }
    
            private String getString() {
                return getItem() == null ? "" : getItem();
            }
        }
    }
    

    最佳答案

    您对 MouseEvent 的导入有误.您需要javafx.scene.input.MouseEvent ,而不是 AWT 版本。

    关于尝试使 Tableview 可点击时出现 JavaFX 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280637/

    相关文章:

    Java ArrayList的Integer[],如何访问元素

    java - 将参数从一个 Controller 传递到另一个 Controller 会产生 java.lang.NullPointerException

    java - NullPointerException 从 FXML 加载场景图,与 Spring 集成

    JavaFX EXCEPTION_ACCESS_VIOLATION

    java - 这是短路的例子吗?

    java - 从我的 JSON 解析器获取空指针异常

    java - 将整数拆分为数字数组

    java - spring jpa 可分页排序 PropertyReferenceException

    JavaFX - Canvas 上的可点击线

    java - 如何从javafx中的另一个类将数据写入.txt文件(FileWriter)