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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//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”.
1 2 3 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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.<em>observableArrayList</em>(personList); System.<em>out</em>.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.
1 2 3 4 5 |
<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.
1 |
@FXML<br>private TextField firstnameTextField, lastnameTextField;<br><br>@FXML<br>private TextArea notesTextArea; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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