/ / Como definir um evento de clique para uma célula de uma coluna da tabela em uma tableview? - mouseevent, javafx-8, fxml

Como definir um evento de clique para uma célula de uma coluna de tabela em um Tableview? - mouseevent, javafx-8, fxml

Eu tenho um TableView em uma das abas de umTabPane. Quero adicionar um evento de clique na célula, o ID do usuário, para que, quando o usuário clicar em um ID de usuário específico, eu abra uma nova guia com detalhes específicos do usuário. como adicionar ouvintes de eventos a todas as células de uma coluna?

<TableView fx:controller="tableViewController"
fx:id="tableViewTable" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
<columns>
<TableColumn text="First Name">
<cellValueFactory>
<PropertyValueFactory property="firstName" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Last Name">
<cellValueFactory>
<PropertyValueFactory property="lastName" />
</cellValueFactory>
</TableColumn>
<TableColumn text="User Id">
<cellValueFactory>
<PropertyValueFactory property="userId" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>

Este blog http://java-buddy.blogspot.com/2013/05/detect-mouse-click-on-javafx-tableview.html fala sobre como capturar o evento click programaticamente, como faço algo semelhante ao usar o FXML?

Respostas:

2 para resposta № 1

Você precisa fazer isso no controlador. Adicione um fx:id para a coluna da mesa (digamos fx:id="userIdColumn") e, em seguida, no controlador, configure uma fábrica de células na coluna:

public class TableViewController {

@FXML
private TableColumn<User, String> userIdColumn ;

public void initialize() {
userIdColumn.setCellFactory(tc -> {
TableCell<User, String> cell = new TableCell<User, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty) ;
setText(empty ? null : item);
}
};
cell.setOnMouseClicked(e -> {
if (! cell.isEmpty()) {
String userId = cell.getItem();
// do something with id...
}
};
return cell ;
});

// other initialization code...
}

// other controller code...

}

Aqui estou assumindo que sua tabela exibe objetos de alguma classe User que você criou e que o ID do usuário é um String. Obviamente, você pode ajustar os tipos conforme necessário.