尝试使Tableview Clickable时出现JavaFX错误

时间:2014-04-10 23:56:36

标签: java javafx

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

  1. 类型参数MouseEvent不在类型变量T的范围内             cell.addEventFilter(MouseEvent.MOUSE_CLICKED,new EventHandler(){ 其中T是一个类型变量: T扩展在接口EventHandler
  2. 中声明的Event
  3. 类Node中的方法addEventFilter不能应用于给定的类型;             cell.addEventFilter(MouseEvent.MOUSE_CLICKED,new EventHandler(){ required:EventType,EventHandler 发现:int,> 原因:没有类型变量T的实例存在,因此参数类型int符合形式参数类型EventType 其中T是一个类型变量: T扩展方法addEventFilter(EventType,EventHandler)
  4. 中声明的事件
    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();
            }
        }
    }
    

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

当IDE提示您导入MouseEvent时,第一个选项可能是java.awt.event.MouseEvent,而不是javafx.scene.input.MouseEvent。

使用JavaFX导入时要小心,因为它的许多类与标准Java库中的类具有相同的名称。