Abrir FXML em um Pane dentro da Scene principal

Olá Pessoal,

Estou desenvolvendo um projeto e tenho um client desktop em javaFX. A minha ideia é que ao clicar em um botão para abrir um formulário de cadastro ou para manipular alguma informação do sistema o fxml correspondente abra em um anchorpane no meio da janela mas sobreposto como se fosse um popup. A partir dai eu posso minimizar ele dentro da aplicação e abrir quando necessário, aplicar opacidade se necessário, etc.

sou novo no fórum e este é o meu primeiro post, não tenho muita experiência com fóruns espero não estar falando besteira rsrsrsrsrsrs

Segue abaixo o fonte fxml da minha página principal:

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

<?import javafx.scene.chart.*?> <?import javafx.scene.canvas.*?> <?import javafx.scene.text.*?> <?import javafx.scene.shape.*?> <?import javafx.scene.*?> <?import javafx.geometry.*?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> [/code]

Não me ocupei ainda com a parte de design mas é mais ou menos isso que vai ser, os CircleFills na página inicial terão no evento onClicked do mouse a chamada de método que abre o fxml correspondente dentro de um anchor pane no centro da janela. É ele que eu queria manipular com minimizar, mover, restaurar mas tudo dentro da janela principal sem sair do programa ou mudar o scene principal.

Segue abaixo o código controller:

[code]public class DesktopClientPresentation implements Initializable{

private Controller controller = new ClientController();

@FXML private Button btnProduto,
                        btnLocalDeEstoque,
                        btnFornecedores,
                        btnMesas,
                        btnMovimentos;

@FXML private AnchorPane paneCenter;
private Scene scene;

/**
 * Called to initialize a controller after its root element has been
 * completely processed.
 *
 * @param location  The location used to resolve relative paths for the root object, or
 *                  <tt>null</tt> if the location is not known.
 * @param resources The resources used to localize the root object, or <tt>null</tt> if
 */
@Override
public void initialize(URL location, ResourceBundle resources) {

}

public void abrirCadProduto(Event event) throws IOException {

    System.out.println("Abrir Cadastro de Produtos: " + event);

    FXMLLoader fxmlLoader = new FXMLLoader();

    fxmlLoader.setLocation(ProdutosController.class.getResource("/fxml/produtos.fxml"));

    this.paneCenter = (AnchorPane) fxmlLoader.load();

    this.scene = new Scene(this.paneCenter);

}

}[/code]

produtos.fxml

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

<?import javafx.geometry.*?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> [/code]

ProdutosController.java

[code]package presentation;

import javafx.fxml.Initializable;

import java.net.URL;
import java.util.ResourceBundle;

/**

  • Created by Augusto on 08/05/2015.
    /
    public class ProdutosController implements Initializable {
    /
    *
    • Called to initialize a controller after its root element has been
    • completely processed.
    • @param location The location used to resolve relative paths for the root object, or
    •              <tt>null</tt> if the location is not known.
      
    • @param resources The resources used to localize the root object, or null if
      */
      @Override
      public void initialize(URL location, ResourceBundle resources) {
      System.out.println(“Produtos”);
      }
      }
      [/code]

No controller do produtos.fxml eu apenas coloquei pra exibir uma mensagem no console me sinalizando que o mesmo foi inicializado. Apenas pra saber se deu certo…

Código da app principal

[code]package view;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.net.URL;

/**

  • Created by Augusto on 24/04/2015.
    */
    public class App extends Application{

    /**

    • The main entry point for all JavaFX applications.
    • The start method is called after the init method has returned,
    • and after the system is ready for the application to begin running.
    • NOTE: This method is called on the JavaFX Application Thread.
    • @param primaryStage the primary stage for this application, onto which
    •                 the application scene can be set. The primary stage will be embedded in
      
    •                 the browser if the application was launched as an applet.
      
    •                 Applications may create other stages, if needed, but they will not be
      
    •                 primary stages and will not be embedded in the browser.
      

    */
    @Override
    public void start(Stage primaryStage) throws Exception {

     Parent mainPane = FXMLLoader.load(getClass().getResource("/fxml/main.fxml"));
     Scene scene = new Scene(mainPane, 800, 600);
     primaryStage.setTitle("Projeto de Conclusão de Curso");
     primaryStage.setScene(scene);
     primaryStage.show();
    

    }

    public static void main(String[] args) {
    launch(args);
    }

}[/code]

Eu tentei encontrar no google coisas como vários scenes em uma janela, fxml dentro de anchorpane entre outras coisas… meu inglês é bem pobre e sei que tem muito material em inglês de javafx e muitos de ótima qualidade mas to desenvolvendo ainda minha habilidade com inglês…

Bom, vamos lá!!!

Baixe a lib JFXtras https://oss.sonatype.org/content/repositories/snapshots/org/jfxtras/jfxtras-labs/8.0-r4-SNAPSHOT/jfxtras-labs-8.0-r4-20150707.080203-166.jar

Site do projeto: http://jfxtras.org

Adicione a lib ao seu Classpath

Agora vamos ao código(um tanto quanto tosco).




import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import jfxtras.labs.scene.control.window.CloseIcon;
import jfxtras.labs.scene.control.window.MinimizeIcon;
import jfxtras.labs.scene.control.window.Window;



public class InnerWindow extends Application {

    private static int count = 1;

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button btn = new Button(&quot;New Window&quot;);
        AnchorPane anchorPane = new AnchorPane(btn);

        btn.setOnAction(a-&gt;{
            //Slider para controlar a opacidade da Janela(Window - JFXtras)
            Slider slider = new Slider(0,1,1);

            Text text = new Text();
            text.setText(&quot;Janela: &quot; + count);
            text.setFill(Color.WHITE);
            text.setFont(Font.font(15));

            BorderPane borderPane = new BorderPane();
            borderPane.setCenter(text);
            borderPane.setBottom(slider);


            //Criando nossa janela
            Window window = new Window(&quot;Window: &quot;+count);
            
            //Posicionado na tela
            window.setLayoutX(300);
            window.setLayoutY(150);
            
            //Definindo o tamanho
            window.setPrefSize(300, 300);
            
            //Add. icones close e minimize
            window.getLeftIcons().addAll(new CloseIcon(window));
            window.getRightIcons().addAll(new MinimizeIcon(window));
            
            //Add. o borderPane na Window
            window.getContentPane().getChildren().addAll(borderPane);
            
            //Fazendo o bind da opacidade com o slider
            window.opacityProperty().bind(slider.valueProperty());
            
            anchorPane.getChildren().addAll(window);
            count++;
        });

        primaryStage.setScene(new Scene(anchorPane, 800, 600));
        primaryStage.show();

    }
    public static void main(String[] args) {launch(args);}

}

No exemplo fiz tudo no código, mas você pode usar fxml para criar sua tela e setar esse fxml no Window

Repare na Window 2, o controle do Slider sobre a opacidade da Janela

Boa noite!

ao utilizar esse código, esta me dando um erro Window window = new Window("Window: "+count); o eclipse não esta reconhecendo esse comando!