Uma ListView control mostra itens em uma observable list e deixa você selecionar um ou múltiplos itens. Para mostrar uma Person do lado direito do formulário, você utiliza o change listener no selectedItemProperty.
O change listener é invocado toda vez que o usuário selecionar um item diferente do ListView ou deselecionar o item. Ao deselecionar, o novo valor será null, e limpamos o formulário.
//código 1
listView.getSelectionModel()
.selectedItemProperty()
.addListener( personChangeListener = (observable, oldValue, newValue) -> {
// newValue pode ser null se nada for selecionado
selectedPerson = newValue;
modifiedProperty.set(false);
if (newValue != null) {
// Preenche o formulário com os dados da pessoa selecionada
firstnameTextField.setText(selectedPerson.getFirstname());
lastnameTextField.setText(selectedPerson.getLastname());
notesTextArea.setText(selectedPerson.getNotes());
} else {
firstnameTextField.setText("");
lastnameTextField.setText("");
notesTextArea.setText("");
}
});
Propriedade boolean modifiedProperty verifica se o usuário mudou qualquer texto no formulário. Resetamos essa flag para cada seleção do ListView e uso dessas propriedades na expressão bind para controlar a propriedades disable do botão Atualizar.
No arquivo Main.java vamos comentar todo o código e adicionar o seguinte código.

No arquivo Scene1.fxml temos que dizer a ele quem vai ser o seu controlador, para isso adicione no AnchorPane o código fx:controller=”main.java.br.com.cursojavanow.FXMLController”.
<AnchorPane fx:controller="main.java.br.com.cursojavanow.FXMLController"
maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1">
O arquivo FXMLController.java fica assim:
package main.java.br.com.cursojavanow;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import main.java.br.com.cursojavanow.model.Person;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
public class FXMLController implements Initializable{
@FXML
private ListView<Person> listPersons;
private List<Person> personList = new ArrayList<>();
private ObservableList<Person> obsPerson;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
Person p1 = new Person("Michel", "Medeiros", "Pessoa 1");
Person p2 = new Person("Angela", "Ferraz", "Pessoa 2");
Person p3 = new Person("Jean", "Medeiros", "Pessoa 3");
personList.add(p1);
personList.add(p2);
personList.add(p3);
obsPerson = FXCollections.observableArrayList(personList);
System.out.println(obsPerson.size());
listPersons.setItems(obsPerson);
}
}
Agora ao clicar no nome que aparece na lista quero que os valores sejam jogados no formulário.
No arquivo Scene1.fxml deixe o ListView dessa maneira.
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="326.0" prefWidth="169.0">
<children>
<ListView fx:id="listPersons" layoutX="5.0" layoutY="11.0" onMouseClicked="#clicouNaPessoa" prefHeight="368.0" prefWidth="163.0" />
</children>
</AnchorPane>
Aqui está o código que executa ao clicar no nome da lista. Esse código é do arquivo FXMLController.java.
No início do código deve-se identificar os campos do formulário.
@FXML
private TextField firstnameTextField, lastnameTextField;
@FXML
private TextArea notesTextArea;
public void clicouNaPessoa(MouseEvent mouseEvent) {
listPersons.getSelectionModel().selectedItemProperty()
.addListener((obsPerson, oldValue, newValue) -> {
System.out.println("OLD: " + oldValue + ", NEW: " + newValue);
Person selectedPerson = newValue;
if (newValue != null) {
firstnameTextField.setText(selectedPerson.getFirstname());
lastnameTextField.setText(selectedPerson.getLastname());
notesTextArea.setText(selectedPerson.getNotes());
} else {
firstnameTextField.setText("");
lastnameTextField.setText("");
notesTextArea.setText("");
}
});
}
Está funcionado, mas não perfeitamente. Porque enquanto não mudo o clique para o outro nome da lista, ele não aparece no formulário. Isso só acontece no início.
Verificando o System.out.println() dá para ver que os antigos valores dos cliques ficam armazenados, e eu não quero isso.
Outro coisa é que no //código 1, eu não utilizei como está lá. Porque não consegui implementá-lo daquela maneira.

Fonte: The Definitive Guide to Modern Java Clients with JavaFX





Deixe um comentário