2015-02-08 139 views
2

如何在javafx 8中實現上述功能?我能夠使用cellFactory構造帶有CheckBoxTableCell的表格列,但無法訪問複選框以向其添加偵聽器。那麼我應該如何繼續?生成包含複選框的列表並將列表添加到這些複選框

編輯----

import BillControl.Controller.PopulateView; 
import BillControl.Controller.Validator; 
import BillControl.MainApp; 
import BillControl.model.Article; 
import BillControl.model.Job; 
import javafx.beans.property.*; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.CheckBoxTableCell; 
import javafx.stage.Stage; 
import javafx.util.Callback; 


import java.util.ArrayList; 
import java.util.TreeSet; 
import java.util.stream.Collectors; 


public class ArticleJobAssignmentController { 
    private Article article; 
    private Stage jobAssignStage; 
    private boolean okClicked = false; 
    private MainApp mainApp; 
    ArrayList<Job> selectedJobList = new ArrayList<>(); 
    private ObservableList<Job> masterJobList = FXCollections.observableArrayList(); 
    private ObservableList<Job> currentJobList = FXCollections.observableArrayList(); 
    private ObservableList<Job> articleEngagementList = FXCollections.observableArrayList(); 
    private TreeSet rowIndices = new TreeSet(); 
@FXML 
private Label articleNameLabel; 
@FXML 
private Label noOfJobsLabel; 
@FXML 
private Button okButton; 
@FXML 
private Button cancelButton; 
@FXML 
private Label errorLabel; 



@FXML 
private TableView<Job> jobTableView; 
@FXML 
private TableColumn<Job, CheckBox> checkBoxTableColumn; 
@FXML 
private TableColumn<Job, String> jobNameColumn; 
@FXML 
private TableColumn<Job, String> clientNameColumn; 
@FXML 
private TableColumn<Job, Integer> noOfArticlesColumn; 
@FXML 
private TableColumn<Job, String> alreadyEngagedColumn; 


public ArticleJobAssignmentController(){ 

} 

public void initialize(){ 
    articleNameLabel.setText(article.getName()); 
    jobTableView.setItems(currentJobList); 
    errorLabel.setVisible(false); 
    jobTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
    jobTableView.setEditable(true); 



    checkBoxTableColumn.setCellFactory(new Callback<TableColumn<Job, CheckBox>, TableCell<Job, CheckBox>>() { 
     @Override 
     public TableCell<Job, CheckBox> call(TableColumn<Job, CheckBox> param) { 
      return new CheckBoxTableCell<Job, CheckBox>(); 
     } 
    }); 


    jobNameColumn.setCellValueFactory(
      cellData -> cellData.getValue().nameProperty() 
    ); 

    noOfArticlesColumn.setCellValueFactory(
      cellData -> { 
       SimpleIntegerProperty sip = new SimpleIntegerProperty(cellData.getValue().numberOfArticlesProperty().getValue()); 
       ObservableValue<Integer> ov = sip.asObject(); 
       return ov; 
      } 

    ); 

    alreadyEngagedColumn.setCellValueFactory(
     cellData -> { 
      Boolean engaged = false; 
      for(Job job: articleEngagementList){ 
       if(job.getNumberID().equals(cellData.getValue().getNumberID())){ 
        engaged = true; 
       } 
      } 

      if(engaged){ 
       SimpleStringProperty sbp = new SimpleStringProperty("Yes"); 
       ObservableValue<String> ov = sbp; 
       return ov; 
      } 
      else { 
       SimpleStringProperty sbp = new SimpleStringProperty("No"); 
       ObservableValue<String> ov = sbp; 
       return ov; 
      } 
     } 
    ); 

    jobTableView.getSelectionModel().getSelectedItems().addListener(
      new ListChangeListener<Job>() { 
       @Override 
       public void onChanged(Change<? extends Job> c) { 
        noOfJobsLabel.setText(String.valueOf(c.getList().size())); 
       } 
      } 
    ); 



    for(Job job : currentJobList){ 
     CheckBox cb = checkBoxTableColumn.getCellData(job); 
     cb.selectedProperty().addListener(
       (obsv, oldv, newv) -> { 
        ArrayList<Job> tempSelectionArray = new ArrayList<>(); 

        if(newv.booleanValue()){ 
         tempSelectionArray.addAll(jobTableView.getSelectionModel().getSelectedItems().stream().collect(Collectors.toList())); 
         this.jobTableView.getSelectionModel().clearSelection(); 

         for(Job arrayJob: tempSelectionArray){ 
          jobTableView.getSelectionModel().select(arrayJob); 
         } 

         tempSelectionArray.clear(); 
        } 
        else{ 
         tempSelectionArray.addAll(this.jobTableView.getSelectionModel().getSelectedItems().stream().collect(Collectors.toList())); 
         this.jobTableView.getSelectionModel().clearSelection(); 
         tempSelectionArray.remove(getJobTableView().getFocusModel().getFocusedItem()); 

         for(Job arrayJob: tempSelectionArray){ 
          this.jobTableView.getSelectionModel().select(arrayJob); 
         } 

         tempSelectionArray.clear(); 
        } 

       } 
     ); 
    } 


} 

public void filterMasterList(){ 
    for(Job job : masterJobList){ 
     if(!job.getIsCompleted()){ 
      currentJobList.add(job); 
     } 
    } 
} 


@FXML 
public void handleOkClicked(){ 
    if(!Validator.articleJobAssignment(this)){ 

     for(Job job : jobTableView.getSelectionModel().getSelectedItems()){ 
      selectedJobList.add(job); 
     } 
     okClicked = true; 
     jobAssignStage.close(); 
    } 
    else { 
     errorLabel.setText("Select at least one job"); 
     errorLabel.setVisible(true); 
    } 
} 

@FXML 
public void handleCancelClicked(){ 
    jobAssignStage.close(); 
} 

public void setArticle(Article article) { 
    this.article = article; 

} 

public void setJobAssignStage(Stage jobAssignStage) { 
    this.jobAssignStage = jobAssignStage; 
} 

public void setOkClicked(boolean okClicked) { 
    this.okClicked = okClicked; 
} 

public void setMainApp(MainApp mainApp) { 
    this.mainApp = mainApp; 
    setMasterJobList(mainApp.getJobObservableList()); 
    filterMasterList(); 


    if(article != null){ 
     articleEngagementList = PopulateView.articleCurrentEngagementList(articleEngagementList, article.getId(), mainApp.getClientObservableList()); 
    } 
} 

public Label getArticleNameLabel() { 
    return articleNameLabel; 
} 

public Label getNoOfJobsLabel() { 
    return noOfJobsLabel; 
} 

public Button getOkButton() { 
    return okButton; 
} 

public Button getCancelButton() { 
    return cancelButton; 
} 

public TableView<Job> getJobTableView() { 
    return jobTableView; 
} 

public TableColumn<Job, String> getJobNameColumn() { 
    return jobNameColumn; 
} 

public TableColumn<Job, String> getClientNameColumn() { 
    return clientNameColumn; 
} 

public TableColumn<Job, Integer> getNoOfArticlesColumn() { 
    return noOfArticlesColumn; 
} 

public ObservableList<Job> getMasterJobList() { 
    return masterJobList; 
} 

public void setMasterJobList(ObservableList<Job> masterJobList) { 
    this.masterJobList = masterJobList; 
} 

public boolean isOkClicked() { 
    return okClicked; 
} 

public ArrayList<Job> getSelectedJobList() { 
    return selectedJobList; 
} 

}

+0

可能重複[CheckBoxTableCell的ChangeListener不工作(http://stackoverflow.com/questions/25210690/checkboxtablecell-changelistener-not-工作) – 2015-02-08 14:27:46

+0

可能重複[Javafx 8 Tableview選擇與複選框](http://stackoverflow.com/questions/28351008/javafx-8-tableview-selection-with-checkbox) – Jurgen 2015-02-08 15:33:18

回答

2

JavaFX是所有關於分離型號查看

CheckBoxTableCell查看ObservableValue<Boolean>型號

我們看不到您的代碼,但在某處您必須用某種BooleanProperty初始化您的CheckBoxTableCell。該屬性在呈現的TableView中被CheckBox切換。

所以你只需要註冊監聽器到這個/這些屬性/屬性。


編輯:

你應該改變你的TableColumn

private TableColumn<Job, CheckBox> checkBoxTableColumn; 

private TableColumn<Job, Boolean> checkBoxTableColumn; 

而且您將需要一個BooleanPropertyJob類。例如:

private final BooleanProperty test = new SimpleStringProperty(this, "test", false); 

public BooleanProperty testProperty() { 
    return test; 
} 

現在回到你TableView

checkBoxTableColumn.setCellFactory(CheckBoxTableCell.forTableColumn(checkBoxTableColumn.setCellFactory()); 
checkBoxTableColumn.setCellValueFactory(c -> c.getValue().testProperty()); 
+0

張貼代碼.. – eskawl 2015-02-08 10:45:30

+0

也看到更新回答您以前的帖子:http://stackoverflow.com/questions/28351008/javafx-8-tableview-sele ction-with-checkbox/28351442#28351442 – Jurgen 2015-02-08 11:10:45

+0

@eskawl查看我的編輯。 – eckig 2015-02-08 11:11:46