1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

JavaFX - Obter um objeto de outro Controller

Estou começando a estudar JavaFX na faculdade e eu preciso fazer a parte de manutenção de sitema de aluguel de carros.

Porém, eu não estou conseguindo entender como eu me comunico através de 2 controllers.

No PrimaryStageController eu tenho uma observableList(veiculosList) com objetos Veiculos, eu preciso pegar o objeto selecionado nessa observableList para então jogar os seus atributos em outra janela (PreventivaConfigController).

como é possível fazer isso?

PrimaryStageController.java

package Controller;

import Model.Danos;
import Model.Veiculos;
import View.DataLoader;
import View.Manutenção;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import jdk.nashorn.internal.codegen.CompilerConstants;

/**
 * FXML Controller class
 *
 * @author Daniel
 */
public class PrimaryStageController implements Initializable {

    Manutenção javaFX = new Manutenção();

    @FXML
    private TableView<Veiculos> tableVeiculos;
    @FXML
    private TableView<Danos> tableDanos;
    @FXML
    private Button btnExcluir;
    @FXML
    private Button btnSearch;
    @FXML
    private Button btnClearSearch;
    @FXML
    private TextField txtSearch;
    @FXML
    private Label txtQuilometragem;
    @FXML
    private Label txtUltimaRevisao;
    @FXML
    private Label txtProximaRevisao;
    @FXML
    private Label txtKm;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        //Carrega ArrayList de Veiculos e Danos e tranforma em uma ObservableList / FilteredList
        ArrayList<Veiculos> veiculosListArray = DataLoader.loadVeiculos();
        ObservableList<Veiculos> veiculosList = FXCollections.observableArrayList(veiculosListArray);
        FilteredList<Veiculos> filteredData = new FilteredList<>(veiculosList, p -> true);
        tableVeiculos.setItems(FXCollections.observableArrayList(veiculosList));

        ArrayList<Danos> danosListArray = DataLoader.loadDanos();
        ObservableList<Danos> danosList = FXCollections.observableArrayList(danosListArray);
        tableDanos.setItems(FXCollections.observableArrayList(danosList));

        // Adiciona um listener para saber quando um novo item é selecionado na tabela
        tableVeiculos.getSelectionModel().selectedItemProperty().addListener((event, oldValue, newValue) -> {
            unbindData(oldValue);
            bindData(newValue);
        });

        // Filtragem de Veiculos
        // 1. Cria um listener
        txtSearch.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(Veiculos -> {
                // Se a caixa de texto estiver vazia, mostre todos os veículos.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                // Compara todas as colunas de todos os veículos. Para isso transforma todo o texto em letras minúsculas.
                String lowerCaseFilter = newValue.toLowerCase();

                if (Veiculos.getRenavam().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filtra por renavam.
                } else if (Veiculos.getPlaca().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filtra por placa.
                } else if (Veiculos.getClasse().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filtra por classe.
                } else if (Veiculos.getMarca().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filtra por marca.
                } else if (Veiculos.getModelo().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filtra por modelo.
                }
                return false; // Não achou resultados.
            });
        });

        // 2. Insere a FilteredList em uma SortedList. 
        SortedList<Veiculos> sortedData = new SortedList<>(filteredData);

        // 3. Faz um bind da SortedList com a TableView(tableVeiculos).
        sortedData.comparatorProperty().bind(tableVeiculos.comparatorProperty());

        // 4. Adiciona os dados ordenados(sorted) e filtrados(filtered) na tabela.
        tableVeiculos.setItems(sortedData);

        /* Redimensionar A tabela DANOS automaticamente (não está sendo usado, mas deixe aqui)
         prioridade.prefWidthProperty().bind(danos.widthProperty().multiply(0.3333)); //33%
         local.prefWidthProperty().bind(danos.widthProperty().multiply(0.3333));      //33%
         descricao.prefWidthProperty().bind(danos.widthProperty().multiply(0.3333));  //33% */

        //Desabilitar Botões
        btnExcluir.disableProperty().bind(tableDanos.getSelectionModel().selectedItemProperty().isNull());
        btnClearSearch.disableProperty().bind(txtSearch.textProperty().isEmpty());

    }

    //Carrega as janelas da classe "Manutenção"
    public void MPconfig() throws IOException {
        javaFX.MPconfig();
    }

    public void MCconfig() throws IOException {
        javaFX.MCconfig();
    }

    public void MPadd() throws IOException {
        javaFX.MPadd();
    }

    public void MCadd() throws IOException {
        javaFX.MCadd();
    }

    public void Dadd() throws IOException {
        javaFX.Dadd();
    }

    public void Historico() throws IOException {
        javaFX.Historico();
    }

    /**
     * Limpa a busca
     */
    @FXML
    public void clearSearch() {
        txtSearch.clear();
        txtSearch.requestFocus();
    }

    /**
     * Faz o binding dos Labels com as propriedades de Veiculos
     *
     * @param Veiculos
     */
    private void bindData(Veiculos veiculos) {
        if (veiculos != null) {
            txtQuilometragem.textProperty().bind(veiculos.quilometragemProperty());
            txtUltimaRevisao.textProperty().bind(veiculos.ultimaRevisaoProperty());
            txtProximaRevisao.textProperty().bind(veiculos.proximaRevisaoProperty());
        }
    }

    /**
     * Desfaz o binding dos Labels com as propriedades de Veiculos
     *
     * @param Veiculos
     */
    private void unbindData(Veiculos veiculos) {
        if (veiculos != null) {
            txtQuilometragem.textProperty().unbind();
            txtUltimaRevisao.textProperty().unbind();
            txtProximaRevisao.textProperty().unbind();

        }
    }

}

PrimaryStage.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.text.*?>


<BorderPane id="BorderPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="Controller.PrimaryStageController">
    <left>
        <GridPane>
            <padding>
                <Insets bottom="10" top="0" />  
            </padding>
            <GridPane hgap="5" vgap="5" GridPane.columnIndex="0" GridPane.rowIndex="0">
                <GridPane.margin>
                    <Insets bottom="10" left="0" /> 
                </GridPane.margin>
                <TableView fx:id="tableVeiculos" prefHeight="1000.0" prefWidth="752" BorderPane.alignment="CENTER" GridPane.vgrow="ALWAYS" >
                    <columns>
                        <TableColumn fx:id="renavam" prefWidth="150" text="RENAVAM">
                            <cellValueFactory>
                                <PropertyValueFactory property="renavam" />
                            </cellValueFactory>
                        </TableColumn>
                        <TableColumn fx:id="placa" prefWidth="150" text="Placa" >
                            <cellValueFactory>
                                <PropertyValueFactory property="placa" />
                            </cellValueFactory>
                        </TableColumn>
                        <TableColumn fx:id="classe" prefWidth="150" text="Classe" >
                            <cellValueFactory>
                                <PropertyValueFactory property="classe" />
                            </cellValueFactory>
                        </TableColumn>
                        <TableColumn fx:id="marca" prefWidth="150" text="Marca" >
                            <cellValueFactory>
                                <PropertyValueFactory property="marca" />
                            </cellValueFactory>
                        </TableColumn>
                        <TableColumn fx:id="modelo" prefWidth="150" text="Modelo" >
                            <cellValueFactory>
                                <PropertyValueFactory property="modelo" />
                            </cellValueFactory>
                        </TableColumn>
                    </columns>
                    <sortOrder>
                        <fx:reference source="modelo"/>
                    </sortOrder> 
                </TableView>

            </GridPane>

            <GridPane hgap="10" vgap="10" GridPane.columnIndex="0" GridPane.rowIndex="1">
                <GridPane.margin>
                    <Insets bottom="0" left="5" /> 
                </GridPane.margin>
                <TextField fx:id="txtSearch" promptText="Digite uma PLACA, CLASSE, MARCA, MODELO ou RENAVAM para pesquisar." GridPane.columnIndex="0" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0" /> 
                <HBox alignment="CENTER_RIGHT" spacing="10" GridPane.columnIndex="1" GridPane.rowIndex="0">
                    <Button fx:id="btnClearSearch" prefWidth="80" text="Limpar" onAction="#clearSearch"  />
                </HBox>
            </GridPane>
        </GridPane>
    </left>
    <center>
        <GridPane hgap="10" vgap="10" stylesheets="@Layout.css">
            <padding>
                <Insets left="10" right="10" bottom="10" top="10" />  
            </padding>

            <HBox GridPane.columnSpan="2" GridPane.rowIndex="0" spacing="5" >
                <Label text="MANUTENÇÃO PREVENTIVA" GridPane.columnIndex="0" GridPane.rowIndex="0" styleClass="titulo" />
                <Button GridPane.columnIndex="1" GridPane.rowIndex="0" styleClass="btn-config"  onAction="#MPconfig">  
                    <tooltip>
                        <Tooltip text="Configurações" /> 
                    </tooltip>
                    <padding>
                        <Insets top="4" bottom="4" right="8" left="8"  />  
                    </padding>
                </Button>
                <Button GridPane.columnIndex="2" GridPane.rowIndex="0" styleClass="btn-add" onAction="#MPadd">  
                    <tooltip>
                        <Tooltip text="Adicionar" /> 
                    </tooltip>
                    <padding>
                        <Insets top="4" bottom="4" right="8" left="8"  />  
                    </padding>
                </Button>
                <Button text="Histórico de Manutenções" GridPane.columnSpan="3" GridPane.rowIndex="0" prefWidth="160" onAction="#Historico" />
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="2" spacing="5">
                <Label text="Quilometragem:" GridPane.columnIndex="0" GridPane.rowIndex="2" styleClass="texto" />
                <Label fx:id="txtQuilometragem" text="" GridPane.columnIndex="1" GridPane.rowIndex="2" styleClass="texto" />
                <Label fx:id="txtKm" text="Km" GridPane.columnIndex="1" GridPane.rowIndex="3" styleClass="texto" />
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="3" spacing="5">
                <Label text="Última revisão:" GridPane.columnIndex="0" GridPane.rowIndex="3" styleClass="texto" />
                <Label fx:id="txtUltimaRevisao" text="" GridPane.columnIndex="1" GridPane.rowIndex="3" styleClass="texto" />
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="4" spacing="5">
                <Label text="Próxima revisão:" GridPane.columnIndex="0" GridPane.rowIndex="4" styleClass="texto" />
                <Label fx:id="txtProximaRevisao" text="" GridPane.columnIndex="1" GridPane.rowIndex="4" styleClass="texto" />
            </HBox> 

            <Separator prefWidth="200.0" GridPane.rowIndex="6" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" />

            <HBox GridPane.columnSpan="1" GridPane.rowIndex="7" spacing="5" >
                <Label text="MANUTENÇÃO CORRETIVA" GridPane.columnIndex="0" GridPane.rowIndex="7" styleClass="titulo" />
                <Button GridPane.columnIndex="1" GridPane.rowIndex="7" prefHeight="10" prefWidth="10" styleClass="btn-config" onAction="#MCconfig">
                    <tooltip>
                        <Tooltip text="Configurações" /> 
                    </tooltip>
                    <padding>
                        <Insets top="4" bottom="4" right="8" left="8"  />  
                    </padding>
                </Button>
                <Button GridPane.columnIndex="2" GridPane.rowIndex="0" styleClass="btn-add" onAction="#MCadd">  
                    <tooltip>
                        <Tooltip text="Adicionar" /> 
                    </tooltip>
                    <padding>
                        <Insets top="4" bottom="4" right="8" left="8"  />  
                    </padding>
                </Button>
                <Button text="Histórico de Manutenções" GridPane.columnSpan="3" GridPane.rowIndex="0" prefWidth="160" onAction="#Historico" />
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="9" spacing="5">
                <Label text="Última manutenção:" GridPane.columnIndex="0" GridPane.rowIndex="9" styleClass="texto" />           
                <Label text="#Última manutenção#" GridPane.columnIndex="0" GridPane.rowIndex="9" styleClass="texto" />     
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="10" spacing="5">      
                <Label text="Itens:" GridPane.columnIndex="0" GridPane.rowIndex="10" styleClass="texto" />           
                <Label text="#Itens#" GridPane.columnIndex="0" GridPane.rowIndex="10" styleClass="texto" />  
            </HBox>

            <HBox GridPane.columnIndex="0" GridPane.rowIndex="11" spacing="5">         
                <Label text="Valor:" GridPane.columnIndex="0" GridPane.rowIndex="11" styleClass="texto" />
                <Label text="#Valor#" GridPane.columnIndex="0" GridPane.rowIndex="11" styleClass="texto" />
            </HBox>

            <Separator prefWidth="200.0" GridPane.rowIndex="13" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" />   

            <Label text="DANOS" GridPane.columnIndex="0" GridPane.rowIndex="14" styleClass="titulo" />

            <TableView fx:id="tableDanos" GridPane.hgrow="ALWAYS" GridPane.columnSpan="2" prefWidth="2000"  GridPane.rowIndex="16" GridPane.vgrow="ALWAYS"  >    
                <columns>
                    <TableColumn fx:id="prioridade" prefWidth="170" text="Prioridade" >
                        <cellValueFactory>
                            <PropertyValueFactory property="prioridade" /> 
                        </cellValueFactory>
                    </TableColumn>
                    <TableColumn fx:id="local" prefWidth="170" text="Local" >
                        <cellValueFactory>
                            <PropertyValueFactory property="local" /> 
                        </cellValueFactory>
                    </TableColumn>
                    <TableColumn fx:id="descricao" prefWidth="170" text="Descrição" >
                        <cellValueFactory>
                            <PropertyValueFactory property="descricao" /> 
                        </cellValueFactory>
                    </TableColumn>
                </columns>  
                <columnResizePolicy>
                    <!-- Igonore o erro. -->
                  <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                </columnResizePolicy>
            </TableView>

            <HBox alignment="CENTER_RIGHT" spacing="10" GridPane.columnSpan="2" GridPane.rowIndex="17" GridPane.hgrow="ALWAYS" >
                <Button prefWidth="80" text="Adicionar" onAction="#Dadd"  />
                <Button fx:id="btnExcluir" prefWidth="80" text="Excluir" />
            </HBox> 
        </GridPane>
    </center>
</BorderPane>

PreventivaConfigController.java

/*
 * Criado por: Daniel Sousa
 * Email: sousa.dfs@gmail.com
 */
package Controller;

import Model.Veiculos;
import Controller.PrimaryStageController;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class PreventivaConfigController implements Initializable {

    Veiculos v;

    @FXML
    private RadioButton rdioDias;

    @FXML
    private RadioButton rdioQuilometros;

    @FXML
    private Label txtDias;

    @FXML
    private Label txtQuilometros;

    @FXML
    private TextField tfDias;

    @FXML
    private TextField tfQuilometros;

    @FXML
    private Button btnCancelar;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //Binds para desabilitar campos
        txtDias.disableProperty().bind(rdioQuilometros.selectedProperty());
        tfDias.disableProperty().bind(rdioQuilometros.selectedProperty());
        txtQuilometros.disableProperty().bind(rdioDias.selectedProperty());
        tfQuilometros.disableProperty().bind(rdioDias.selectedProperty());
    }

    @FXML
    public void exit() {
        Stage stage = (Stage) btnCancelar.getScene().getWindow();
        stage.close();
    }

PreventivaConfig.xml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.text.*?>

<GridPane id="GridPane" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller.PreventivaConfigController">
    <stylesheets>
        <URL value="@Layout.css"/>
    </stylesheets>
    <padding>
        <Insets left="10" right="10" top="10" bottom="10" />    
    </padding>

    <HBox GridPane.columnIndex="0" GridPane.rowIndex="0" spacing="5">  
        <padding>
            <Insets bottom="20" />    
        </padding>
        <children>
        <Label text="Quilometragem: " styleClass="texto" />
        </children>
        <children>
        <TextField text="25000" prefWidth="225"  />
        </children>
        <children>
        <Label text="Km" styleClass="texto" />
        </children>
    </HBox>

    <HBox GridPane.columnIndex="0" GridPane.rowIndex="1" spacing="10" >  
        <padding>
            <Insets bottom="20" />    
        </padding>
        <children>
            <Label text="Calcular a próxima revisão por: " styleClass="texto" />
        </children>
        <children>
            <fx:define>
                <ToggleGroup fx:id="Intervalo"/>
            </fx:define>
            <RadioButton fx:id="rdioDias" text="Dias" toggleGroup="$Intervalo" alignment="CENTER" />
            <RadioButton fx:id="rdioQuilometros" text="Quilômetros" toggleGroup="$Intervalo" alignment="CENTER" />
        </children>  
    </HBox>

    <HBox GridPane.columnIndex="0" GridPane.rowIndex="2" spacing="10">  
        <padding>
            <Insets bottom="20" />    
        </padding>
        <children>
        <Label fx:id="txtDias" text="Dias: " styleClass="texto" />
        </children>
        <children>
        <TextField fx:id="tfDias" text="60" prefWidth="110" />
        </children>
        <children>
        <Label fx:id="txtQuilometros" text="Quilômetros: " styleClass="texto" />
        </children>
        <children>
        <TextField fx:id="tfQuilometros" text="25000" prefWidth="110" />
        </children>
    </HBox>

    <HBox fx:id="hbox" GridPane.columnIndex="0" GridPane.rowIndex="3" spacing="10" alignment="CENTER_RIGHT" >
        <children>
        <Button fx:id="btnSalvar" text="Salvar" prefWidth="80" onAction="#save" />  
        </children>
        <children>
        <Button fx:id="btnCancelar" text="Cancelar" prefWidth="80" onAction="#exit" />  
        </children>
    </HBox>

</GridPane>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags javafx controller java ou faça a sua própria pergunta.