关于 java:在 TableView (JAVAFX) 中的单元格中添加按钮
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 // Creating the Observable list to be data for the table // Addin the edit button
@Override // setng data the table } } |
这是一个替代解决方案,其中编辑列的单元格值属性是一个 ReadOnlyObjectWrapper,它package了整个"行对象"。然后它在列上设置一个 cellFactory 以显示按钮。由于单元格的 item 属性代表整行,因此可以使用 cell.getItem().
轻松访问该行的值
|
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; public class TableViewWithEditButton extends Application { @Override TableColumn<Person, Person> editColumn = column("Edit", ReadOnlyObjectWrapper<Person>::new, 60); table.getColumns().add(editColumn); editColumn.setCellFactory(col -> { editButton.setOnAction(e -> edit(cell.getItem(), primaryStage)); return cell ; table.getItems().addAll( primaryStage.setScene(new Scene(new BorderPane(table))); private void edit(Person person, Stage primaryStage) { GridPane grid = new GridPane();
grid.addRow(0, new Label("First name:"), firstNameTextField); Button okButton = new Button("OK"); grid.add(okButton, 0, 3, 2, 1); ColumnConstraints leftCol = new ColumnConstraints(); Scene scene = new Scene(grid); okButton.setOnAction(e -> stage.hide()); stage.initModality(Modality.APPLICATION_MODAL); private TextField boundTF(StringProperty binding) { private <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue< T >> property, double width) { public static class Person { public Person(String firstName, String lastName, String email) { public final StringProperty firstNameProperty() { public final java.lang.String getFirstName() { public final void setFirstName(final java.lang.String firstName) { public final StringProperty lastNameProperty() { public final java.lang.String getLastName() { public final void setLastName(final java.lang.String lastName) { public final StringProperty emailProperty() { public final java.lang.String getEmail() { public final void setEmail(final java.lang.String email) { } public static void main(String[] 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; public class TableButtonColumnDemo extends Application { @Override ObservableList<EditableFileRow> data = FXCollections.observableArrayList( TableColumn editColumn = new TableColumn("Edit"); StackPane root = new StackPane(); root.getChildren().add(table); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Button Column Demo"); primaryStage.show(); public static void main(String[] args) { public static class EditButton extends Button { public EditButton(String fileName) { public static class EditableFileRow { private final SimpleStringProperty fileName; public EditableFileRow(String fileName) { public String getFileName() { public void setFileName(String fName) { public StringProperty fileNameProperty() { public EditButton getEditButton() { public void setEditButton(EditButton editButton) { public ObjectProperty<EditButton> editButtonProperty() { } |
您可以尝试的另一种方法是使用检测点击的侦听器放置图像而不是按钮。我经常使用该方法来指示它使用不同图像的文件类型,用于 pdf、excel 文件、文本文件等。
相关讨论
- 但在现实生活中,模型类不太可能将 UI 组件作为其属性之一。