keven2
Outubro 2, 2019, 2:41pm
#1
Recentemente eu aprendi a usar checkbox dentro de uma listview, porem eu preciso checar quando a pessoa seleciona a checkbox, pretendo que na 2 vez que a pessoa selecionar a checkbox vai ser bloqueada e ela não poderá selecionar novamente e também não poderá selecionar esse item na listview (meio que um disable)
Eu usei esse código para colocar as checkbox
private static class ListEntry {
private BooleanProperty selected;
private StringProperty text;
public ListEntry(String text) {
this.selected = new SimpleBooleanProperty();
this.text = new SimpleStringProperty(text);
}
public BooleanProperty selectedProperty() {
return selected;
}
public StringProperty textProperty() {
return text;
}
@Override
public String toString() {
return textProperty().get();
}
}
Para preencher (eu puxo direto do banco de dados) eu uso esse procedimento:
private void listFill(){
ObservableList<ListEntry> items = FXCollections.observableArrayList();
lvJogadoresTime.setCellFactory(
CheckBoxListCell.forListView(ListEntry::selectedProperty)
);
for (int n1 = 0; n1 < ConsultasAvaliacao.jogadoreS.size(); n1++){
items.add(new ListEntry(ConsultasAvaliacao.jogadoreS.get(n1)));
}
lvJogadoresTime.setItems(items);
lvJogadoresTime.itemsProperty().addListener(c -> new ChangeListener<ListEntry>(){
//Aki é onde estou tentando fazer o evento da checkbox ,porem nao funciona
//Não apresenta erros no console apenas não funciona
@Override
public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
System.out.println("Selected ? " + newValue.selected + " player " + newValue.text);
}
});
}
Como eu deixei escrito no código:
@Override
public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
System.out.println("Selected ? " + newValue.selected + " player " + newValue.text);
}
});
Eu tentei esse procedimento ^ para criar o evento para a checkbox, porém não funciona, por favor me ajudem.
suaListView.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<SuaClasse>() {
public void changed(ObservableValue<? extends SuaClasse> observable,
System.out.println("selection changed");
}
});
keven2
Outubro 2, 2019, 3:30pm
#3
Não funcionou não amigão
lvJogadoresTime.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ListEntry>() {
@Override
public void changed(ObservableValue<? extends ListEntry> observable, ListEntry oldValue, ListEntry newValue) {
System.out.println("Mudou o valor");
}
});
keven2
Outubro 2, 2019, 3:34pm
#4
Aparentemente está sendo ativado só quando eu seleciono o item, não a checkbox em si, eu quero que cheque quando ele seleciona a checkbox sem precisar selecionar o item da list view
keven2
Outubro 2, 2019, 3:35pm
#6
e mesmo sem selecionar a checkbox esta sendo ativado
O Item que voce se refere no exemplo seria o texto a direita do quadradinho ?
keven2
Outubro 2, 2019, 5:19pm
#9
O “item” que eu quero bloquear é tudo, o texto e o quadradinho, porém quero checar toda vez que a pessoa selecionar o quadradinho, na 2 vez que ele selecionar eu vou bloquear ele poder apertar no quadrinho e no texto
Veja se e’ mais ou menos isso que você quer.
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventType;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ListView2 extends Application {
private int count = 0 ;
private int count_geral = 0;
Data data_control = null;
@Override
public void start(Stage primaryStage) {
ListView<Data> listView = new ListView<>();
Button addButton = new Button("Adiciona");
addButton.setOnAction(e -> listView.getItems().add( new Data(false,"Ola Mundo"+ (++count) ) ) );
Button deleteButton = new Button("Delete");
deleteButton.setOnAction(e -> listView.getItems().remove(listView.getSelectionModel().getSelectedIndex()));
deleteButton.disableProperty().bind(listView.getSelectionModel().selectedItemProperty().isNull());
listView.setCellFactory(lv -> {
ListCell<Data> cell = new ListCell<Data>() {
public CheckBox cb = new CheckBox();
@Override
protected void updateItem(Data item, boolean empty) {
super.updateItem(item, empty);
if(item != null) {
cb.setText(item.txt);
setGraphic(cb);
cb.setOnMouseClicked(e -> {
if(data_control != item ) {
data_control = item;
count_geral = 0;
}
count_geral++;
if(count_geral == 2) {
if(item.on == true) {
item.on = false;
}else {
item.on = true;
}
// listView.getSelectionModel().select(item);
count_geral = 0;
}
cb.setSelected(item.on);
});
}else {
setGraphic(null);
}
}
};
return cell;
});
BorderPane root = new BorderPane(listView);
ButtonBar buttons = new ButtonBar();
buttons.getButtons().addAll(addButton, deleteButton);
root.setBottom(buttons);
Scene scene = new Scene(root, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
public class Data {
int count = 0;
boolean on = false;
String txt=null;
public Data(boolean on, String txt) {
this. on = on;
this.txt = txt;
}
}
}
Bons Codigos
keven2
Outubro 3, 2019, 10:49pm
#11
Creio que é isso, vou testar Aki e depois te aviso, okay
keven2
Outubro 3, 2019, 10:49pm
#12
É que não tou em casa agora
keven2
Outubro 4, 2019, 5:57pm
#13
Bem meu amigo, ele ainda esta permitindo apertar 2 vezes, na verdade esta engraçado, aperto 1 vez nao acontece nada, aperto 2 vezes ele seleciona a chebkox, depois preciso apertar 2 vezes para deslecionar
keven2
Outubro 4, 2019, 6:18pm
#14
Mais valeu, eu usei oque voce me falou e arrumei do meu jeito, obrigado mesmo amigão, vou deixar o código nesse comentário caso alguém precisar
public class Data {
int count = 0;
boolean on = false;
String txt = null;
public Data(boolean on, String txt) {
this.on = on;
this.txt = txt;
}
}
private void listFill(){
for (int n1 = 0;n1 < ConsultasAvaliacao.jogadoreS.size();n1++){
lvJogadoresTime.getItems().add(new Data(false,ConsultasAvaliacao.jogadoreS.get(n1)));
}
lvJogadoresTime.setCellFactory(lv -> {
ListCell<Data> cell = new ListCell<Data>() {
public CheckBox cb = new CheckBox();
@Override
protected void updateItem(Data item, boolean empty) {
super.updateItem(item, empty);
if(item != null) {
cb.setText(item.txt);
setGraphic(cb);
cb.setOnMouseClicked(e -> {
if(data_control != item ) {
data_control = item;
}
if (item.count < 2){
item.count = item.count + 1;
if(item.count == 2){
cb.setSelected(false);
setDisable(true);
}
}
});
}else {
setGraphic(null);
}
}
};
return cell;
});
1 curtida