Add a button to a cells in a TableView (JAVAFX)
我正在尝试向我的表格添加一个编辑按钮。
当我单击按钮时,它将打开一个窗口,其中包含已选择的项目,我尝试了几种添加按钮的方法,但没有一种方法适合我。
谢谢
这是我的控制器的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | public class AmdinConsolcontroler implements Initializable{ @FXML // here we add the create new user window the the event butto private void ActionCreateNewUser (ActionEvent evt) { try { Parent root = FXMLLoader.load(SimpleFXapp.class.getResource("/Views/CreateUser.fxml")); Stage primaryStage = new Stage(); Scene Scene = new Scene(root); primaryStage.setScene(Scene); primaryStage.setTitle("Create"); primaryStage.show(); } catch(Exception Err) { System.out.println("exception from create user"); } } // Creating the Observable list to be data for the table ObservableList<Users> data1 = FXCollections.observableList(Users.GetShortedUsrs()); // Declaring the Table @FXML TableView<Users> ShortedUserList; //Declaring the Columns of the atble @FXML TableColumn<Users, String> ColFirstname ; @FXML TableColumn<Users, String>LastName; @FXML TableColumn<Users, String>UserName; @FXML TableColumn<Users, String>Role; @FXML TableColumn<Users, String>IsActive; @FXML TableColumn<Users, String>LastLogin; @FXML TableColumn Edit = new TableColumn<>("Edit"); // Addin the edit button @Override public void initialize(URL url, ResourceBundle rb) { try{ // initialzing the table column ColFirstname.setCellValueFactory(new PropertyValueFactory("UserName")); LastName.setCellValueFactory(new PropertyValueFactory("UserLastname")); UserName.setCellValueFactory(new PropertyValueFactory("LoginId")); Role.setCellValueFactory(new PropertyValueFactory("UserRole")); IsActive.setCellValueFactory(new PropertyValueFactory("IsActive")); LastLogin.setCellValueFactory(new PropertyValueFactory("LastLogin")); // Adding the edit Button to the // setng data the table ShortedUserList.setItems(data1); } catch(Exception Err) { System.out.println(Err.getMessage()); } } } |
这是一个替代解决方案,其中编辑列的单元格值属性是一个
轻松访问该行的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | import java.util.function.Function; import javafx.application.Application; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; import javafx.geometry.HPos; import javafx.geometry.Insets; 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.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; public class TableViewWithEditButton extends Application { @Override public void start(Stage primaryStage) { TableView<Person> table = new TableView<>(); table.getColumns().add(column("First Name", Person::firstNameProperty, 150)); table.getColumns().add(column("Last Name", Person::lastNameProperty, 150)); table.getColumns().add(column("Email", Person::emailProperty, 200)); TableColumn<Person, Person> editColumn = column("Edit", ReadOnlyObjectWrapper<Person>::new, 60); table.getColumns().add(editColumn); editColumn.setCellFactory(col -> { Button editButton = new Button("Edit"); TableCell<Person, Person> cell = new TableCell<Person, Person>() { @Override public void updateItem(Person person, boolean empty) { super.updateItem(person, empty); if (empty) { setGraphic(null); } else { setGraphic(editButton); } } }; editButton.setOnAction(e -> edit(cell.getItem(), primaryStage)); return cell ; }); table.getItems().addAll( new Person("Jacob","Smith","[email protected]"), new Person("Isabella","Johnson","[email protected]"), new Person("Ethan","Williams","[email protected]"), new Person("Emma","Jones","[email protected]"), new Person("Michael","Brown","[email protected]") ); primaryStage.setScene(new Scene(new BorderPane(table))); primaryStage.show(); } private void edit(Person person, Stage primaryStage) { TextField firstNameTextField = boundTF(person.firstNameProperty()); TextField lastNameTextField = boundTF(person.lastNameProperty()); TextField emailTextField = boundTF(person.emailProperty()); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(16)); grid.addRow(0, new Label("First name:"), firstNameTextField); grid.addRow(1, new Label("Last name:"), lastNameTextField); grid.addRow(2, new Label("Email:"), emailTextField); Button okButton = new Button("OK"); grid.add(okButton, 0, 3, 2, 1); ColumnConstraints leftCol = new ColumnConstraints(); leftCol.setHgrow(Priority.NEVER); leftCol.setHalignment(HPos.RIGHT); ColumnConstraints rightCol = new ColumnConstraints(); rightCol.setHgrow(Priority.SOMETIMES); grid.getColumnConstraints().addAll(leftCol, rightCol); GridPane.setHalignment(okButton, HPos.CENTER); Scene scene = new Scene(grid); Stage stage = new Stage(); okButton.setOnAction(e -> stage.hide()); firstNameTextField.setOnAction(e -> stage.hide()); lastNameTextField.setOnAction(e -> stage.hide()); emailTextField.setOnAction(e -> stage.hide()); stage.initModality(Modality.APPLICATION_MODAL); stage.initOwner(primaryStage); stage.initStyle(StageStyle.UNDECORATED); stage.setScene(scene); stage.show(); } private TextField boundTF(StringProperty binding) { TextField textField = new TextField(); textField.textProperty().bindBidirectional(binding); textField.setMinWidth(80); return textField ; } private <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue< T >> property, double width) { TableColumn<S,T> col = new TableColumn<>(title); col.setCellValueFactory(cellData -> property.apply(cellData.getValue())); col.setPrefWidth(width); return col ; } public static class Person { private final StringProperty firstName = new SimpleStringProperty(); private final StringProperty lastName = new SimpleStringProperty(); private final StringProperty email = new SimpleStringProperty(); public Person(String firstName, String lastName, String email) { setFirstName(firstName); setLastName(lastName); setEmail(email); } public final StringProperty firstNameProperty() { return this.firstName; } public final java.lang.String getFirstName() { return this.firstNameProperty().get(); } public final void setFirstName(final java.lang.String firstName) { this.firstNameProperty().set(firstName); } public final StringProperty lastNameProperty() { return this.lastName; } public final java.lang.String getLastName() { return this.lastNameProperty().get(); } public final void setLastName(final java.lang.String lastName) { this.lastNameProperty().set(lastName); } public final StringProperty emailProperty() { return this.email; } public final java.lang.String getEmail() { return this.emailProperty().get(); } public final void setEmail(final java.lang.String email) { this.emailProperty().set(email); } } public static void main(String[] args) { launch(args); } } |
这是您可以做到的一种方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package tablebuttoncolumndemo; import javafx.application.Application; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class TableButtonColumnDemo extends Application { @Override public void start(Stage primaryStage) { ObservableList<EditableFileRow> data = FXCollections.observableArrayList( new EditableFileRow("A File"), new EditableFileRow("A Big File"), new EditableFileRow("A Lost File") ); TableColumn editColumn = new TableColumn("Edit"); editColumn.setCellValueFactory(new PropertyValueFactory<>("editButton")); TableColumn fileNameColumn = new TableColumn("File Name"); fileNameColumn.setCellValueFactory(new PropertyValueFactory<>("fileName")); TableView table = new TableView(); table.getColumns().addAll(editColumn, fileNameColumn); table.setItems(data); StackPane root = new StackPane(); root.getChildren().add(table); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Button Column Demo"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } public static class EditButton extends Button { public EditButton(String fileName) { super("Edit"); setOnAction((event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Hey!"); alert.setHeaderText(null); alert.setContentText("You're editing "" + fileName +"""); alert.showAndWait(); }); } } public static class EditableFileRow { private final SimpleStringProperty fileName; private final SimpleObjectProperty<EditButton> editButton; public EditableFileRow(String fileName) { this.fileName = new SimpleStringProperty(fileName); editButton = new SimpleObjectProperty(new EditButton(fileName)); } public String getFileName() { return fileName.get(); } public void setFileName(String fName) { fileName.set(fName); } public StringProperty fileNameProperty() { return fileName; } public EditButton getEditButton() { return editButton.get(); } public void setEditButton(EditButton editButton) { this.editButton.set(editButton); } public ObjectProperty<EditButton> editButtonProperty() { return editButton; } } } |
您可以尝试的另一种方法是使用检测点击的侦听器放置图像而不是按钮。我经常使用该方法来指示它使用不同图像的文件类型,用于 pdf、excel 文件、文本文件等。