Quero fazer com que minha coluna Togglebutons funcione corretamente dentro do meu TableView. Quando pressiono o botão de alternância, nada acontece. Como consertar isso? Não mudei nada no meu modelo "Medicaments.java". Parece que você vê abaixo:
@FXML
private TableColumn<Medicaments, Void> editRow;
Meu modelo:
public Medicaments(int idNumber, String LOTNumber, String medName, String dateExpiry, int quantity, String unit,String timeLeft) {
this.idNumber = idNumber;
this.LOTNumber = LOTNumber;
this.medName = medName;
this.dateExpiry = dateExpiry;
this.quantity = quantity;
this.unit = unit;
this.timeLeft = timeLeft;
}
Coluna do botão de alternância:
private void AddEditButton() {
TableColumn<Medicaments, Void> colBtn = new TableColumn("");
Callback<TableColumn<Medicaments, Void>, TableCell<Medicaments, Void>> cellFactory = new
Callback<TableColumn<Medicaments, Void>, TableCell<Medicaments, Void>>() {
@Override
public TableCell<Medicaments, Void> call(final TableColumn<Medicaments, Void> param)
{
final TableCell<Medicaments, Void> cell = new TableCell<Medicaments, Void>() {
private final ToggleButton toggleButton = new ToggleButton("Edit");
{
/**/
toggleButton.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
event.consume();
toggleButton.selectedProperty().addListener((observable,oldValue,
newValue) -> {
if(newValue){
toggleButton.setText("Save");
} else {
toggleButton.setText("Edit");
}
});
});
/*btn.addEventFilter(MouseEvent.MOUSE_PRESSED, event ->{
event.consume();
Medicaments data = getTableView().getItems().get(getIndex());
System.out.println("selectedData: " + data);
});*/
}
@Override
public void updateItem(Void item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
setGraphic(toggleButton);
}
}
};
return cell;
}
};
editRow.setCellFactory(cellFactory);
}
Esta resposta provavelmente se aplica , pois provavelmente você está alterando algo que o TableView não pode ver.
Se sua instância de TableView for um membro privado da classe na qual o
addEditButton()
método aparece, você poderá chamárefresh()
-la diretamente de dentro doupdateItem(Void item, boolean empty)
método depois de definir o gráfico. Caso contrário, você terá que adicionar a instância TableView à assinatura do método addEditButton para que o método update possa chamá-la ou acessá-la de dentro do método adicionando um acessador à classe que a contém. O primeiro método ( por exemplo ):Observe que talvez você precise fazer o
tableView
final
; faz algum tempo.Aqui está um exemplo. Haverá outras abordagens que você também poderá adotar e que podem ser mais genéricas.
Uma solução recomendada pode ser uma implementação baseada em modificações em uma cópia do código de CheckBoxTableCell (que não apresentarei aqui).
Aviso
Se você mesmo estiver implementando funcionalidades semelhantes, tome cuidado ao tentar copiar um tutorial para um botão simples (como você observou nos comentários). Tal abordagem pode levá-lo por um caminho incorreto.
Um botão não possui um estado interno que reflita, enquanto um botão de alternância possui um estado (pode ser selecionado ou não).
À medida que os itens que apoiam as linhas são atualizados (por exemplo, novos itens adicionados à lista, ou a lista é reordenada, ou a tabela é classificada), você precisa do botão de alternância para continuar a refletir o estado correto do item ao qual foi associado (ou o novo item ao qual está agora associado), mas isso é desnecessário para um botão simples que não possui estado.
Portanto, a natureza do problema que precisa ser resolvido quando um controle com estado, como um ToggleButton, está envolvido, é diferente daquele de um controle sem estado e a solução pode diferir de acordo.