Passar variável para outro Controller

1,096 views
Skip to first unread message

Anderson

unread,
Sep 27, 2012, 10:20:20 AM9/27/12
to java...@googlegroups.com
Tenho uma estrutura resumida assim:

Controller1
   controller1.fxml
         include
              Controller2
              controller2.fxml
         include
              Controller3
              controller3.fxml

Preciso do Controller2 alterar uma variável no Controller3.
Mesmo declarando Controller3, no Controller2 com @FXML, ele fica nulo.

Alguma idéia?


Att,

        Anderson


Junior Tada

unread,
Oct 3, 2012, 10:03:07 AM10/3/12
to java...@googlegroups.com
Como vc está instanciando seus arquivos .fxml? No construtor no controller ou de outra forma?
Vc está inserindo no método construtor da classe controller 3 um objeto controller 2?

Anderson

unread,
Oct 3, 2012, 10:14:06 AM10/3/12
to java...@googlegroups.com
    <TabPane id="tp" fx:id="tp">
      <tabs>
        <Tab id="tbHome" fx:id="tbHome" closable="false" style="" text="Home">
          <content>
            <fx:include source="home/home.fxml" />
                      >>>
                      <VBox fx:id="pnlHome" xmlns:fx="http://javafx.com/fxml" fx:controller="home.HomeController">
                         >>>>
                         HomeController.java
                              @FXML
                              private VBox pnlHome;

                              @Override
                              public void initialize(URL url, ResourceBundle rb)
                              {
                              }
                         <<<<
                         <children>
                        </children>
                        </VBox>
                       <<<
          </content>
        </Tab>
        <Tab id="tbClientes" fx:id="tbClientes" closable="false" style="" text="Clientes">
          <content>
            <fx:include source="clientes/clientes.fxml" />
          </content>
        </Tab>
        <Tab id="tbPedidos" fx:id="tbPedidos" closable="false" style="" text="Pedidos">
          <content>
            <fx:include source="pedidos/pedidos.fxml" />
          </content>
        </Tab>
      </tabs>
    </TabPane>


O instanciamento é feito pelas respectivas classes controller indicado no fxml, com o public void initialize(URL url, ResourceBundle rb)

Att,

        Anderson

Junior Tada

unread,
Oct 3, 2012, 10:42:37 AM10/3/12
to java...@googlegroups.com
Então Anderson, eu não sei se é a forma correta de aplicar, até porque também estou aprendendo, mais o que eu faço é remover a tag fx:controller do .fxml, instanciar a classe controller desse .fxml sem controller e na hora de instanciar esse controller eu instancio ele com o construtor que tem o código que chama o .fxml e que passo os parâmetros que desejo alterar. Algo mais ou menos assim: 
public class MailOkController extends AnchorPane{
   
    @FXML //  fx:id="bt_ok"
    private Button bt_ok; // Value injected by FXMLLoader
    Stage stageOk;
    
    public MailOkController(Stage x, Parametro 1, Parametro 2, etc){
        stageOk = x;
        FXMLLoader fxmlLoader = new FXMLLoader(appotica_v2.AppOtica_v2.class.getResource("/view/mailOk.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try{
            fxmlLoader.load();
        }catch(IOException exception){
            throw new RuntimeException(exception);
        }
    }
........
.......

Agora fiquei curioso com o seu código.. pq vc está utilizando um .fxml para cada tab? É um sistema web ou desktop? Pq não cria num mesmo .fxml todas as tab's?
 

Filipe Portes

unread,
Oct 3, 2012, 10:52:51 AM10/3/12
to java...@googlegroups.com
Ola pessoal,

essa discussão de como integrar controladores era bem comum nas listas de Flex... 
Apesar de existirem diversas formas "obscuras" de instanciar seus controllers essa não é uma boa prática de design para seus projetos.

Quando surge a necessidade de uma interface interagir com outra, a forma mais indicada para resolver é através do uso de eventos customizados, quando vc clica em um botão por exemplo, seu controlador recebe esse clique e as informações sobre ele por meio de um evento, da mesma forma você pode disparar seus próprios eventos e "escuta-los" em outras telas.


2012/10/3 Junior Tada <junio...@gmail.com>



--
Filipe Portes - @filipeportes
Java Architect - Senior Java EE/Web
JUGLeader Gojava - @gojava

Anderson

unread,
Oct 3, 2012, 11:16:49 AM10/3/12
to java...@googlegroups.com
Junior...

vou estudar esta forma.
Estou separando as tabs por fxml, pois prefiro que que tabs tenha seu controller (MVC).
E facilita também a manutenção/implementação, quando tem que fazer alguma alteração, na tab.


Filipe...

Vou estudar o código. Esta sua colocação é uma das características que mais gostava em Delphi.
A criação de métodos/eventos, facilitava bastante este tipo de problema.

Att,

        Anderson

Junior Tada

unread,
Oct 3, 2012, 11:47:37 AM10/3/12
to java...@googlegroups.com
Muito obrigado Filipe, eu já olhei todos esses tutoriais do site da oracle e algumas partes dos blogs também sobre fxml, esse sobre os eventos eu não tinha visto, me parece que foi postado recente, quando entrei no site ele não estava.
É Anderson como eu falei, estou aprendendo também vou dar uma estudada sobre como implementar trabalhando só com eventos. A performance deve ser bem melhor, apesar de ser um pouco mais complexo de aplicar na primeira vez. Se vc utilizar desta forma, poste aqui como implementou. 
Att.

Anderson

unread,
Oct 3, 2012, 1:24:09 PM10/3/12
to java...@googlegroups.com
Filipe.

Já li e reli, o link, mas não consegui criar um evento customizado.
Algo como:

  public EventHandler event = new EventHandler()
  {
    @Override
    public void handle(Event t, Registro reg) >> um exemplo
    {
      throw new UnsupportedOperationException("Not supported yet.");
    }
  };

node.addEventHandler(Qual evento, event);

Ou se tiver um exmplo como referência, poderia nos passar?

Att,

        Anderson

Reply all
Reply to author
Forward
0 new messages