IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Comment terminer une application javaFX ?


Sujet :

JavaFX

Vue hybride

GGMARTINELLI Comment terminer une... 30/10/2023, 19h40
bouye Plateform.exit() sert a...... 30/10/2023, 22h54
GGMARTINELLI En réalité je découvre javaFX... 31/10/2023, 12h29
bouye J'avoue ne pas bien saisir le... 01/11/2023, 07h52
GGMARTINELLI Je suis désolé de ne pas être... 05/11/2023, 10h22
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 49
    Par défaut Comment terminer une application javaFX ?
    Bonjour,

    J'ai défini une classe javaFX Application : HTMLEditorSAmple.java qui est démarrée à partir d'une classe Test.java. elle affiche un panneau d'édition de Texte.
    Lorsque j'ai terminé de frapper mon texte, je termine par Platform.exit() puis je retourne à ma classe appelante .

    Cela marche bien, mais si j'ai besoin de taper un nouveau texte, je ne sais pas comment faire car la méthode launch() ne peut être lancé qu'une seule fois.

    Dans mon exemple ci-dessous, j'ai créé une boucle pour entrer 3 textes différents. Évidemment cela ne marche pas.
    Si vous avez des idées, merci de les partager.

    Gérard

    Classe Appelante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    package exercices;
     
    public class Test
    {
    	public void ok( ) 
    	{
    		int count = 1;
    		for (int i=0; i<3; )
    		{
    		 String args = "Bonjour Gérard. " + count++;
      		 javafx.application.Application.launch(HTMLEditorSample.class, args);
    		 String res  = HTMLEditorSample.htmlText;
    		 System.out.println(res);
    		}
        }
    	public static void main(String[] args) 
    	{
    		new  Test().ok( );
        }
    }
    Classe Application javaFX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
          package exercices;
     
    	import java.io.File;
    	import javafx.application.Application;
    	import javafx.application.Platform;
    	import javafx.scene.*;
    	import javafx.scene.control.Button;
    	import javafx.scene.control.ToolBar;
    	import javafx.scene.control.Tooltip;
    	import javafx.scene.image.Image;
    	import javafx.scene.image.ImageView;
    	import javafx.scene.layout.VBox;
    	import javafx.scene.web.HTMLEditor;
    	import javafx.stage.Stage;
     
    	public class  HTMLEditorSample extends Application
    	{
    		protected boolean saveText = false;
    		public static String htmlText  = "Ceci est juste un test";
    		public static Stage stage;
     
    	    @Override
    	    public void start(Stage primaryStage) 
    	    {
    	    	stage = primaryStage;
    	    	primaryStage.setTitle("HTMLEditor Sample");
    	    	primaryStage.setMaxWidth(700);
    	    	primaryStage.setMaxHeight(800);    
    	        HTMLEditor htmlEditor = new HTMLEditor();
    	        htmlText =  getParameters().getUnnamed().get(0);
     
    	        htmlEditor.setPrefHeight(800);
    	        htmlEditor.setStyle(
    	        	    "-fx-font: 16 cambria;"
    	        	    + "-fx-border-color: brown; "
    	        	    + "-fx-border-style: dotted;"
    	        	    + "-fx-border-width: 6;"
    	        	);
    	        ToolBar bar = null;
    	        Node node = htmlEditor.lookup(".top-toolbar");
    	        if (node instanceof ToolBar) {
    	            bar = (ToolBar) node;
    	           //  System.out.println( "Size before layout pass: "+bar.getItems().size());
    	        }
     
    	        htmlEditor.setHtmlText(htmlText);
    	        VBox vBox = new VBox(htmlEditor);
    	        primaryStage.setScene(new Scene(vBox));
    	        primaryStage.show(); //invokes layout pass
     
    	        if (bar == null)  return  ;
     
    	        // On charge les icones pour la barre de tâche
     
    	        ImageView imgViewS= loadImage("images/save.png");
    	        ImageView imgViewQ= loadImage("images/quit.png");	
    	        	// on ajoute maintenant une icone à ta barre de tâche
    		 	 Button sauver = new Button();
    		 	 	sauver.setOnAction(event -> saveText=true );  
    		 	 	sauver.setTooltip(new Tooltip("Sauvegarder"));
     
    	         Button quitter = new Button();
    	         	quitter.setOnAction(event -> 
    	         	{ 
    	         		htmlText = htmlEditor.getHtmlText();
    	         		// stage.close();
    	         		 Platform. exit();  ;
    	         	});	 
    	        	quitter.setTooltip(new Tooltip("Quitter"));
    	        	quitter.setGraphic(imgViewQ); 
     
    	         if (imgViewQ != null) { quitter.setGraphic(imgViewQ);bar.getItems().add(0,  quitter) ;}
    	         if (imgViewS != null)  {sauver.setGraphic(imgViewS);  bar.getItems().add(1,  sauver) ;}
    	    }
     
     
    	    private ImageView loadImage(String img)
    	    {
    	    	 // on ajoute maintenant une icone à ta barre de tâche
    			File f = new File(img);
    			ImageView  imgView = new ImageView();
     
    		 	if (f.exists())
    			{
    				 try 
    				 {
    					     Image monImage =new Image(new java.io.FileInputStream(img),32,32,false,false);
    					     if (monImage != null)
    					     {
    					    	imgView = new ImageView();
    					        imgView.setImage(monImage);
    				             }
    				 } 
    				 catch (Exception ex) 
    				 {
     
    					   System.out.println("ImageView pas créée");
    				 }
    				 finally
    				 {
    					 return imgView;
    				 }
    			}
    			else 
    			{
    				System.out.println("fichier non trouvé");
    				return null;
    			}
    	    }
    	    public static void main(String[] args) {
    	        launch(args);
    	    }
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Plateform.exit() sert a... terminer la plateforme comme son nom l'indique.

    Tu sembles prendre la chose par le mauvais bout en tentant de faire que ton application console lance plusieurs applications FX dans ta JVM alors que normalement tu devrais avoir une seule et unique application FX dans ta JVM et cette application ouvre plusieurs fenêtres satellites (quitte a conserver sa fenêtre racine invisible). Les rares fois ou tu as plusieurs applications FX c'est quand tu utilises le mécanisme de l'app loader, car Preloader est une Application légère chargée de lancer une autre Application (l'application principale) avec affichage d'un écran titre et/ou mise a jour et téléchargement de ressources, etc.

    Il reste cependant possible de tenter de faire ce que tu tentes de réaliser. L'un des gros soucis est de pouvoir initialiser le toolkit JavaFX. Une manière de faire est d'initialiser un JFXPanel() qu'on utilisera jamais mais qui se charge des initialisations (c'est bizarre, mais c'est comme ça). Il faudra ensuite gérer a mano les créations et destructions de fenêtres et terminer le tooklit quand la dernière fenêtre est fermée.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package excercices;
     
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
     
    public final class Test {
        public static void main(final String... args) {
            final var dummy = new JFXPanel();
            Platform.setImplicitExit(false);
            Platform.runLater(() -> {
                int count = 1;
                for (int i = 0; i < 3; i++) {
                    String arg = "Bonjour Gérard. " + count++;
                    final var editor = new HTMLEditorSample(arg);
                    String res = HTMLEditorSample.htmlText;
                    System.out.println(res);
                }
            });
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    package excercices;
     
    import javafx.application.Platform;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ToolBar;
    import javafx.scene.control.Tooltip;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.VBox;
    import javafx.scene.web.HTMLEditor;
    import javafx.stage.Stage;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Objects;
    import java.util.Optional;
     
    final class HTMLEditorSample {
        public static String htmlText = "Ceci est juste un test";
        public static Stage stage;
        private static int stageCount = 0;
        private boolean saveText = false;
     
        public HTMLEditorSample(final String arg) {
            htmlText = arg;
            final var stage = new Stage();
            stageCount++;
            stage.setTitle("HTMLEditor Sample");
            stage.setMaxWidth(700);
            stage.setMaxHeight(800);
            final var htmlEditor = new HTMLEditor();
            htmlEditor.setPrefHeight(800);
            htmlEditor.setStyle(
                    "-fx-font: 16 cambria;"
                            + "-fx-border-color: brown; "
                            + "-fx-border-style: dotted;"
                            + "-fx-border-width: 6;"
            );
            final var node = htmlEditor.lookup(".top-toolbar");
            final var bar = (node instanceof ToolBar b) ? b : null;
            htmlEditor.setHtmlText(htmlText);
            final var vBox = new VBox(htmlEditor);
            stage.setScene(new Scene(vBox));
            stage.show(); //invokes layout pass
            if (Objects.nonNull(bar)) {
                // On charge les icones pour la barre de tâche
                final var imgViewS = loadImage("images/save.png");
                final var imgViewQ = loadImage("images/quit.png");
                // on ajoute maintenant une icone à ta barre de tâche
                final var sauver = new Button();
                sauver.setOnAction(event -> saveText = true);
                sauver.setTooltip(new Tooltip("Sauvegarder"));
                Button quitter = new Button();
                quitter.setOnAction(event -> {
                    htmlText = htmlEditor.getHtmlText();
                });
                stage.setOnCloseRequest(event -> {
                    stageCount--;
                    if (stageCount == 0) {
                        Platform.runLater(Platform::exit);
                    }
                });
                quitter.setTooltip(new Tooltip("Quitter"));
                quitter.setGraphic(imgViewQ);
                Optional.ofNullable(imgViewQ)
                        .ifPresent(imgView -> {
                            quitter.setGraphic(imgViewQ);
                            bar.getItems().add(0, quitter);
                        });
                Optional.ofNullable(imgViewS)
                        .ifPresent(imgView -> {
                            sauver.setGraphic(imgViewS);
                            bar.getItems().add(1, sauver);
                        });
            }
        }
     
        private ImageView loadImage(String img) {
            // on ajoute maintenant une icone à ta barre de tâche
            final var f = new File(img);
            ImageView imgView = null;
            if (f.exists()) {
                try (final var input = new FileInputStream(img)) {
                    final var monImage = new Image(input, 32, 32, false, false);
                    imgView = new ImageView(monImage);
                } catch (Exception ex) {
                    System.out.println("ImageView pas créée");
                }
            } else {
                System.out.println("fichier non trouvé");
            }
            return imgView;
        }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 49
    Par défaut
    En réalité je découvre javaFX depuis une semaine.

    Merci beaucoup pour cette réponse détaillée. J'ai toutefois un souci avec ce code (que j'ai modifié légèrement car je ne suis pas encore en version 10 de java) : les panneaux s'enchainent en se superposant sans que j'ai la possibilité d'enter du texte dans le premier et le second.

    En fait il faut que j'explique le pourquoi ce test. J'ai une application beaucoup plus compliquée développée sous swing.

    J'ai créé une classe JDialog (JD par exemple) appelée d'une classe JFrame (JF).
    JD est constitué essentiellement d'un panneau de traitement de texte que j'ai développé à partir d'un JTextPane et qui ressemble beaucoup à HTMLEditor de javaFX (voir ci-dessous). Toutefois, je voudrais essayer de le remplacer par ce dernier..


    La logique est la suivante :

    à Partir de JF , j'instancie la classe JD en modal. Une fois le texte entré, en cliquant sur un bouton, j'exécute this.setVisible(false) et ainsi je reviens dans JF, je libère alors la ressource JD.dispose();

    Je souhaiterais faire de même avec une classe javafx.application. Application. D'où cet exemple.

    Je ne sais pas si cela est possible.

    Merci encore pour ton aide.

    Gérard

    Ci dessous mon panneau :
    Nom : Capture.JPG
Affichages : 241
Taille : 38,5 Ko

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    J'avoue ne pas bien saisir le concept ni le rapport avec le code initialement posté.

    La classe Dialog (de JavaFX) sert à faire des boites de dialogues modaux ou pas.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 49
    Par défaut
    Je suis désolé de ne pas être très clair. Il faut dire que ce sont mes premier pas avec JavaFX et je ne suis pas certain d'avoir compris comment les choses s'articulent.

    Actuellement voici ce que mon application exécute : :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Class MaFrame extends JFrame
    {
          ....
         MonDialogue  dl = new MonDialogue(MaFrame);
         String resultat = dl.process(); 
         dl.dispose(); 
         ....
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    Class MonDialogue extends JDialog
    {
        private JTextPane jt = null;
     
         public MonDialogue (JFrame f);
        {
            super(f, true);
            initialisation();
            this.setVisible(true);
        }
     
     
        private void  initialisation()
        {
                   .......
            jt = new JTextPane();
                //  ajouts des spécifications pour jt; 
            JButton ret = new JButton("Retour")
            // definition de Action Handler pour ret, qui lance : this.setVisible(false);
               ......
        }
        public String  process()
         {
             renvoie le contenu du JTextPane. 
         }
    ....
    }
    La classe MonDialogue peut être appelée plusieurs fois, pour enrichir une base de données.

    Ce que je voudrais faire, c'est remplacer le JTextPane, par un node HTMLEditor, sans bouleverser ma logique, car cela fonctionne depuis des années. Mais je ne suis pas certain que cela est possible ?

    Merci encore pour ton aide.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Tout d'abord je rappelle qu'il est théoriquement possible d'utiliser du JavaFX dans une application Swing mixte. Cela fonctionne grâce au contrôle JFXPanel dans lequel tu peux placer ensuite un HTMLEditor. Mais si cela peut ne pas fonctionner correctement, notamment avec des applications Swing un peu trop "bizarres" / construites a l'arrache.

    Ensuite, ce squelette JavaFX pur fait a peu près la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package test.uidialog;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.scene.control.ButtonType;
    import javafx.scene.control.Dialog;
    import javafx.scene.web.HTMLEditor;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
     
    public final class Main extends Application {
        @Override
        public void start(final Stage stage) throws Exception {
            stage.setTitle("Test");
    //        stage.show();
    //        Platform.setImplicitExit(false);
            Platform.runLater(() -> showDialog(stage));
        }
     
        private void showDialog(final Stage parent) {
            final var htmlEditor = new HTMLEditor();
            htmlEditor.setPrefHeight(800);
            htmlEditor.setStyle(
                    "-fx-font: 16 cambria;"
                            + "-fx-border-color: brown; "
                            + "-fx-border-style: dotted;"
                            + "-fx-border-width: 6;"
            );
            final var dialog = new Dialog<String>();
            dialog.setTitle("Dialog");
            dialog.initModality(Modality.APPLICATION_MODAL);
    //        dialog.initOwner(parent);
            dialog.getDialogPane().setContent(htmlEditor);
            dialog.getDialogPane().getButtonTypes().setAll(ButtonType.OK, ButtonType.CANCEL);
            dialog.setResultConverter(buttonType -> (ButtonType.OK == buttonType) ? htmlEditor.getHtmlText() : null);
            dialog.showAndWait()
                    .ifPresent(result -> System.out.printf("Result: %s%n", result));
        }
    }
    Quelques points a noter :
    • La fenêtre principale ne s’affiche jamais, notre UI est uniquement construite avec une boite de dialogue.
    • De ce fait l'application se termine automatiquement lorsque la boite de dialogue est fermée que l'on clique sur OK ou sur Cancel.
    • Cela peut être prévenu en utilisant Platform.setImplicitExit(false); mais dans ce cas il faudra a un moment invoquer Platform.exit() sinon l'application continuera de tourner indéfiniment.
    • J'utilise Java 21 + JavaFX 21 et j'ai une NullPointerException dans la gestion des CSS (faites par FX puisque je ne fais rien ici au niveau des CSS) lorsque j'invoque dialog.initOwner(parent);. Ceci arrive tout le temps lorsque la fenêtre principale est visible ou cachee, donc je pense a un bug dans cette version.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2016, 07h04
  2. Réponses: 4
    Dernier message: 23/02/2010, 11h00
  3. Réponses: 11
    Dernier message: 25/05/2006, 11h42
  4. Réponses: 1
    Dernier message: 31/10/2002, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo