2015-06-30 37 views
2

我正在嘗試將編輯按鈕添加到我的表中。 當我點擊按鈕它會打開一個窗口與選定的項目,我嘗試了幾種方法來添加按鈕,但沒有人爲我工作。 謝謝 這裏是我的控制器代碼:向TableView中的單元添加按鈕(JAVAFX)

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










} 




} 

回答

2

這裏是你能做到這一點的方法之一。

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文件,文本文件等不同圖像的文件類型。

+0

但在現實生活中,模型類不太可能將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", "jac[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); 
    } 
} 
相關問題