• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JAVAfx - działanie na tej samej scenie.

Object Storage Arubacloud
0 głosów
841 wizyt
pytanie zadane 4 sierpnia 2018 w Java przez periedynek Obywatel (1,320 p.)

Cześć. 

Są to moje początki z JavąFX. 

Mam pytanie jak zrobić, by w tym samym oknie pokazało się tak jakby nowe okno z nowym plikiem FXML.

Mój kod wygląda tak:

Main

package sample;

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

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXML/Main.fxml"));
        primaryStage.setTitle("Application");
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


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

ControllerMain

package sample;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.layout.StackPane;


import java.io.IOException;

public class ControllerMain {

    @FXML
    private StackPane stackPane;

    @FXML
    void onApplication() throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("FXML/Application.fxml"));
        stackPane.getChildren().add(root);
    }
}


Main.fxml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.StackPane?>


<StackPane fx:id="stackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.ControllerMain">
   <children>
      <Button fx:id="button" mnemonicParsing="false" onAction="#onApplication" text="Button" />
   </children>
</StackPane>

Application.fxml

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

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>


<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label text="Label" />
   </children>
</StackPane>

Tak jak to teraz zrobiłem, to nowy plik faktycznie się wyświetla, ale stare rzeczy nie znikają, mimo, że w Application.fxml jest nowy StackPane i Label dodany.

2 odpowiedzi

+2 głosów
odpowiedź 4 sierpnia 2018 przez miro Pasjonat (23,870 p.)

Już dawno temu bawiłem się z JavaFX i nie wiem czy zrozumiałem Twój problem, więc wybacz jak głupoty napiszę. Jak chcesz podmienić sceny to stwórz nowy Scene i ją ustaw w primaryStage tak jak zrobiłeś to w Main tylko zrób to z tym samym stagem.
Możesz zrobić pomocniczą klasę do ładowania wyglądów jak tutaj

komentarz 4 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
edycja 4 sierpnia 2018 przez periedynek

Chodzi mi by w tym samym oknie wyskoczył nowy "wygląd", czyli żeby nie odpalało drugiego okna, jeżeli zrobiłbym tą metodą:

 Parent root = FXMLLoader.load(getClass().getResource("FXML/main2.fxml"));
        primaryStage.setTitle("Application");
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();

Nie zrozumiałem zbytnio co napisałeś, chodzi Ci o ten skrawek np.? 

public void showStart() {
        try {
            FXMLLoader loader = getLoader(START_FXML);
            VBox vboxStart = (VBox) loader.load();

            Scene scene = new Scene(vboxStart);
            primaryStage.setTitle(bundle.getString("title.start"));
            primaryStage.setScene(scene);

            StartController controller = loader.getController();
            controller.setPrimaryStage(this.primaryStage);
            controller.setManager(this);
            controller.init();
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Znalazłem podobne rozwiązanie, ale go nie rozumiem. Twój sposób na githubie jest właśnie drugim sposobem na ładowanie FMXL'ów. za pomocą FMXLLoadera, ja to robie za pomocą:

Parent root = FXMLLoader.load(getClass().getResource("FXML/Main.fxml"));

A Ty:

FXMLLoader loader = getLoader(START_FXML);

później mozesz wyciągnąć z tego referencję:

DrawCardController controller = loader.getController();

a ja już z root'a nie i nie wiem jak to inaczej zrobić, ale tym moim sposobem, bo musi się dać i właśnie chciałbym go poznać.

Ale kompletnie tego wycinka nie rozumiem

StartController controller = loader.getController();
controller.setManager(this);
controller.init();
primaryStage.show();ł

 

komentarz 4 sierpnia 2018 przez miro Pasjonat (23,870 p.)

Sorry trochę późno może jutro spróbuję wytłumaczyć mój wycinek. Ogólnie chodziło mi o to, że musisz zrobić nową scenę i ustawić go w stage:

 Scene scene = new Scene(root);
 primaryStage.setScene(scene);

Tutaj znalazłem prosty przykład

komentarz 4 sierpnia 2018 przez periedynek Obywatel (1,320 p.)

Jutro popatrze na link, bo też zaraz uciekam spać.

Nie wiem czy Tobie chodziło o takie coś?

void onApplication() throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("FXML/Application.fxml"));
        Stage primaryStage = new Stage();
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

Tutaj tworzę nową scenę, ale właśnie tworzę też nowego stage'a przez co pojawia mi się durgie okno.

komentarz 5 sierpnia 2018 przez miro Pasjonat (23,870 p.)
Jak dobrze pamiętam to musisz zostać na tym samym stage bo to jest Twoje okno, a podmieniać scene czyli układ.
komentarz 5 sierpnia 2018 przez periedynek Obywatel (1,320 p.)
Tylko jak to zrobić, skoro działam na dwóch różnych klasach. Ty miałeś fajnie zrobione, bo miałeś wszystko w jednej i tworzyłeś tylko instancję.
0 głosów
odpowiedź 5 sierpnia 2018 przez mbabane Szeryf (79,280 p.)

Podobne pytania

0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 1 listopada 2018 w Java przez ILikeJava Obywatel (1,230 p.)
0 głosów
2 odpowiedzi 526 wizyt
pytanie zadane 7 sierpnia 2018 w Java przez Niemiro72 Użytkownik (660 p.)
0 głosów
2 odpowiedzi 144 wizyt
pytanie zadane 13 marca 2023 w Java przez elvis Nowicjusz (210 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...