【问题标题】:Add a button to a cells in a TableView (JAVAFX)向 TableView 中的单元格添加按钮(JAVAFX)
【发布时间】:2015-09-17 07:23:54
【问题描述】:

我正在尝试向我的表格添加一个编辑按钮。 当我单击按钮时,它会打开一个窗口并选择项目,我尝试了几种添加按钮的方法,但没有一种方法适合我。 谢谢 这是我的控制器的代码:

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());
        }










}  




}

【问题讨论】:

    标签: java javafx tableview


    【解决方案1】:

    这是您可以做到的一种方法。

    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 文件、文本文件等。

    【讨论】:

    • 但在现实生活中,模型类不太可能将 UI 组件作为其属性之一。
    【解决方案2】:

    这是另一种解决方案,其中编辑列的单元格值属性是一个ReadOnlyObjectWrapper,它包裹了整个“行对象”。然后它在列上设置cellFactory 以显示按钮。由于单元格的item 属性代表整行,因此可以使用cell.getItem() 轻松访问该行的值。

    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", "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")
            );
    
            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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 2020-10-20
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多