Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [JavaFX] Lanciare un'altra finestra e minimizzare quella corrente

    ciao!

    sto giocherellando con JavaFX (visto che da quanto ho capito prima o poi sostituirà swing).
    ho creato un progetto di test, dove questo è il main:
    codice:
    public class Main extends Application {
    
        @Override
    public void start(Stage primaryStage) throws Exception {
            Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
            primaryStage.setTitle("Main");
            primaryStage.setScene(new Scene(root, 500, 500));
            primaryStage.setResizable(false);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    il controlle associato a main.fxml è ControllerUno:
    codice:
    public class ControllerUno {
    
        @FXML
    private void onBtnClicked() throws IOException {
            Parent root = FXMLLoader.load(getClass().getResource("due.fxml"));
            Stage stage = new Stage();
            stage.setTitle("Main");
            stage.setScene(new Scene(root, 500, 500));
            stage.setResizable(false);
            stage.show();
        }
    
    }
    questo avvia la scene due.fxml con il suo controller associato.
    ma mi chiedevo:
    1) è il modo corretto per avviare altre finestre?
    2) come faccio a minimizzare la prima una volta avviata la seconda?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    1) è il modo corretto per avviare altre finestre?
    Non sono ancora molto preparato su JavaFX (forse ne sai qualcosina in più tu di me ) ma ad occhio mi pare ok, non vedo nulla di palesemente errato. Dal punto di vista tecnico, intendo.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    2) come faccio a minimizzare la prima una volta avviata la seconda?
    Se nel onBtnClicked riesci ad avere il riferimento al "primary" Stage, puoi nasconderlo ( hide() ) oppure minimizzarlo ( setIconified(true) ).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao andbin!

    ecco, questo funziona:
    codice:
    public class ControllerUno {
    
        @FXML
    private void onBtnClicked(ActionEvent event) throws IOException {
            Parent root = FXMLLoader.load(getClass().getResource("due.fxml"));
            Stage stage = new Stage();
            stage.setTitle("Main");
            stage.setScene(new Scene(root, 500, 500));
            stage.setResizable(false);
            stage.show();
    
            Stage thisStage = (Stage)((Node)event.getSource()).getScene().getWindow();
            thisStage.setIconified(true);
        }
    
    }
    però mi chiedo questo: se avessi tante finestre da lanciare, dovrei copiare questo codice ovunque.
    se volessi avere un metodo che prende in input i parametri (tipo l'fxml da lanciare, il titolo, le dimensioni, ecc) mi conviene:
    - creare un metodo in una classe apposita
    - mettere questo metodo in un ControllerBase, e poi estendere quello??

    PS: io che ne so più di te su qualcosa che riguarda java lo trovo impossibile!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
            Stage thisStage = (Stage)((Node)event.getSource()).getScene().getWindow();
    A dire il vero, è possibile ottenere lo Stage in modo molto più "pulito" e senza nemmeno andare a scomodare gli oggetti degli eventi.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    però mi chiedo questo: se avessi tante finestre da lanciare, dovrei copiare questo codice ovunque.
    se volessi avere un metodo che prende in input i parametri (tipo l'fxml da lanciare, il titolo, le dimensioni, ecc) mi conviene:
    - creare un metodo in una classe apposita
    - mettere questo metodo in un ControllerBase, e poi estendere quello??
    Dipende .... cosa vuoi generalizzare e cosa invece vuoi specializzare? E' questo che va valutato in questi casi, insomma, cosa vuoi non dover ripetere e cosa vuoi eventualmente parametrare?

    Quote Originariamente inviata da fermat Visualizza il messaggio
    PS: io che ne so più di te su qualcosa che riguarda java lo trovo impossibile!!!
    Su JavaFX .... è possibile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok, ho visto che si può ottenere lo stage dal top component del file fxml.
    quindi:
    codice:
    <VBox fx:id="uno" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.mp.testfx.ControllerUno">
    
    </VBox>
    poi:
    codice:
    public class ControllerUno {
    
        @FXML
    VBox uno;
    
        @FXML
    private void onBtnClicked() throws IOException {
            Parent root = FXMLLoader.load(getClass().getResource("due.fxml"));
            Stage stage = new Stage();
            stage.setTitle("Main");
            stage.setScene(new Scene(root, 500, 500));
            stage.setResizable(false);
            stage.show();
    
            Stage ss = (Stage) uno.getScene().getWindow();
            ss.setIconified(true);
        }
    
    }
    non so se intendevi altro!

    per quanto riguarda l'altra questione.
    io vorrei fare un metodo del genere, da richiamare ogni qual volta si debba aprire una finestra:
    codice:
    private void openWindow(String fileFxml, String title, int width, int height, boolean resiz) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource(fileFxml));
        Stage stage = new Stage();
        stage.setTitle(title);
        stage.setScene(new Scene(root, width, height));
        stage.setResizable(resiz);
        stage.show();
    }
    una cosa del genere.
    qui si passano come parametri le impostazioni basiche.
    ecco, dove mi converebbe mettere un metodo del genere??

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ok, ho visto che si può ottenere lo stage dal top component del file fxml.
    non so se intendevi altro!
    Sì, intendevo altro. Se usavi direttamente FXMLLoader (e non dal load statico), potevi prendere il controller e "iniettargli" tu lo Stage semplicemente mettendo campo e setter nel tuo ControllerUno.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    io vorrei fare un metodo del genere, da richiamare ogni qual volta si debba aprire una finestra
    E va anche bene, non vedo nulla di palesemente errato.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    ecco, dove mi converebbe mettere un metodo del genere??
    Puoi metterlo dove preferisci, anche come metodo statico di utilità (ma occhio, il getClass() non è più usabile, se statico)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Puoi metterlo dove preferisci, anche come metodo statico di utilità (ma occhio, il getClass() non è più usabile, se statico)
    si ho visto, dovrei fare una cosa del genere:
    codice:
    public class Utils {
        public static void openWindow(String fileFxml, String title, int width, int height, boolean resiz) throws IOException {
            Parent root = FXMLLoader.load(MyClass.class.getResource(fileFxml));
            Stage stage = new Stage();
            stage.setTitle(title);
            stage.setScene(new Scene(root, width, height));
            stage.setResizable(resiz);
            stage.show();
        }
    }
    quindi dovrei passare un altro parametro al metodo, corretto??

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    quindi dovrei passare un altro parametro al metodo, corretto??
    Cioè? Non ho capito .... non bastano i 5 che stai trattando??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    cioè, quel getClass() lo devo sostituire con qualcosa del tipo MyClass.class, giusto?
    se ho capito bene, allora quel MyClass glielo dovrò passare in qualche modo, o non ci ho capito nulla (cosa probabile ovviamente)??

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    cioè, quel getClass() lo devo sostituire con qualcosa del tipo MyClass.class, giusto?
    Sì ma dipende anche dalla specifica della risorsa, cioè se inizia con "/" oppure no. Se inizia con "/" allora è assoluta dalla "radice" lungo il classpath (quindi puoi mettere qualunque class, Utils.class, TuaAltraClasse.class ecc...).
    Se non inizia con "/" allora la risorsa è relativa al package della classe usata per il getResource.
    E quindi .... saprai tu dove stanno le risorse, no?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.