gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:58:36 24 4
gpt4 key购买 nike

我正在尝试使 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com