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 :

Encore du débogage! Pfft


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut Encore du débogage! Pfft
    Bonjour,

    J'ai un souci avec JavaFX. Je code actuellement un synthé virtuel en JavaFX.

    L'interface est boguée et je n'en trouve pas l'origine dans mon code dont je vous soumets une partie pour discussion (le reste est sur https://gitlab.com/Graphics3D/Plants-2.0 )


    Dans le constructeur de la classe App :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                buttons[i].setOnMousePressed(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        playNote(event.getSource());
                    }
                });
                buttons[i].setOnMouseReleased(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        stopNote(event.getSource());
                    }
                });
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void playNote(Object source) {
            player.addNote(getTone(source), 1000.0f);
     
        }
     
        private void stopNote(Object source) {
            player.stopNote(getTone(source));
        }
    Ce qui se passe c'est que certaines notes "restent enfoncées" c'est-à-dire que la méthode stopNote ne vide pas bien la liste de note en cours.

    J'avais une autre question aussi "Comment construire une application Android à partir de sources Java?" (mais j'irai voir le lien dans le forum approprié)

    Sinon ce qui me plairait à moi c'est d'avoir un collaborateur développeur pour mes projets mais juste qu'ici à part quelques amis intimes personne ne s'y est vraiment intéressé et c'est tellement de temps et d'énergie déployés...

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Bon pour le moment je ne peux rien tester (impossible de cloner le repos a cause de soucis de certificats de mon coté, j'ai ouvert un ticket et verrai quand ça sera réglé. Et impossible de faire tourner un snapshot ZIP car il manque au moins le package empty3 et ses classes).

    Pas moyen de reproduire le problème qui te bloque sur un petit exemple auto-suffisant ?

    Pour le port Android, si tu veux faire de l'Android pur, oui il faudra aller voir dans le forum approprié.

    Si tu préfères garder ton UI en JavaFX et passer par Gluon tu peux poster ici. Par contre mon expérience est limitée dans ce domaine (suis pas un utilisateur payant, j'ignore donc si leur toolchain complète permet de signer/publier une app de bout en bout) et je n'ai fait que quelques tests avec la version gratuite sans support de leur part. Il te faudra un vrai téléphone Android pour tester par contre, la solution de Gluon ne fonctionnant pas sur l’émulateur fourni avec le SKD Android.

    Dans les deux cas tu peux commencer par aller telecharger le SDK Android et Android Studio (une version simplifiee de Intellij IDEA que tu utilises déjà) chez Google
    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
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Je n'ai pas de soucis sur un exemple epure de toute la partie audio. Donc du coup je vais plutot devoir aller voir dans le player si j'ai bien compris.

    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
    import javafx.application.Application;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.canvas.Canvas;
    import javafx.scene.control.Button;
    import javafx.scene.control.RadioButton;
    import javafx.scene.control.Slider;
    import javafx.scene.control.ToggleGroup;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) throws Exception {
            Parent root = new AnchorPane();
            root.minWidth(800);
            root.minHeight(600);
            Scene scene = new Scene(root);
            Button[] buttons = new Button[16];
            HBox[] pane = new HBox[2];
            pane[0] = new HBox();
            pane[1] = new HBox();
            BorderPane bl = new BorderPane();
            bl.setTop(pane[0]);
            bl.setCenter(pane[1]);
            String[] notes = new String[]{
                "do", "re", "mi", "fa", "sol", "la", "si", "do",
                "do#", "re#", "--", "fa#", "sol#", "la#", "--", "do#"};
            for (int i = 0; i < buttons.length; i++) {
                buttons[i] = new Button(notes[i]);
                buttons[i].setLayoutX(100 + i * 30);
                buttons[i].setLayoutY(150 + (i >= 8 ? 30 : 0));
                buttons[i].setId("Button" + i);
                buttons[i].setOnMousePressed(event -> playNote(event.getSource()));
                buttons[i].setOnMouseReleased(event -> stopNote(event.getSource()));
                pane[i < 8 ? 0 : 1].getChildren().add(buttons[i]);
            }
            VBox vBox = new VBox();
            ToggleGroup group = new ToggleGroup();
            RadioButton radioButton = new RadioButton();
            radioButton.setText("Sine");
            radioButton.setToggleGroup(group);
            radioButton.setSelected(true);
            radioButton.setOnAction(event -> {
                String value = ((RadioButton) event.getSource()).getText();
            });
            vBox.getChildren().add(radioButton);
            radioButton = new RadioButton();
            radioButton.setText("Square");
            radioButton.setToggleGroup(group);
            vBox.getChildren().add(radioButton);
            radioButton = new RadioButton();
            radioButton.setText("Triangle");
            radioButton.setToggleGroup(group);
            vBox.getChildren().add(radioButton);
            radioButton = new RadioButton();
            radioButton.setText("Sawtooth");
            radioButton.setToggleGroup(group);
            vBox.getChildren().add(radioButton);
     
            bl.setLeft(vBox);
     
            Slider slider = new Slider();
            slider.setMin(1);
            slider.setMin(10);
            slider.setValue(4);
            slider.setMinorTickCount(1);
            slider.setAccessibleText("Octaves");
            slider.setOnScroll(event -> {
                double value = ((Slider) event.getSource()).getValue();
            });
            bl.setRight(slider);
     
            Pane pane1 = new Pane();
     
            Canvas canvas = new Canvas();
     
            canvas.setWidth(640);
            canvas.setHeight(480);
     
            pane1.getChildren().add(canvas);
     
            bl.setBottom(pane1);
     
            scene.setRoot(bl);
     
            primaryStage.setTitle("Plants 2.0 synth");
            primaryStage.setScene(scene);
            //primaryStage.setFullScreen(true);
            //primaryStage.setMaximized(true);
            primaryStage.show();
            primaryStage.setOnCloseRequest(event -> {
                System.exit(0);
            });
        }
     
        private void playNote(final Object source) {
            System.out.printf("Playing %s%n", ((Button) source).getText());
        }
     
        private void stopNote(final Object source) {
            System.out.printf("Stopping %s%n", ((Button) source).getText());
        }
     
        public static void main(String... args) {
            Application.launch(args);
        }
    }
    Une petite suggestion serait cependant d'utiliser la propriété armed de la classe Button, ca permettrait aussi d'utiliser le clavier en plus de la souris pour activer le bouton.
    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

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Mouai ca va etre plus difficile a tester ca du coup vu que j'ai pas toutes les classes nécessaires a la compilation et que j'ai pas envie de passer 4h a essayer de simplifier la chose. Lorsque tu passes au deboggeur dans Player.stopNote, est ce que le contenu de ta boucle s’exécute correctement ?

    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
     public void stopNote(int tone) {
            getCurrentNotes().forEach(new Consumer<Note>() {
                @Override
                public void accept(Note note) {
                    if (note.getTone() == tone) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                while (!note.isFinish())
                                    ;
                                getCurrentNotes().remove(note);
                                System.out.println("After removed " + getCurrentNotes().size());
                            }
                        });
                    }
                }
            });
        }
    Perso j'aurai plutot fait ca comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public void stopNote(int tone) {
            getCurrentNotes().stream()
                    .filter(note -> note.getTone() == tone)
                    .forEach(note -> Platform.runLater(() -> doStopNode(note)));
        }
     
        private void doStopNode(final Note note) {
            while (!note.isFinish());
            getCurrentNotes().remove(note);
            System.out.println("After removed " + getCurrentNotes().size());
        }
    Si tu es sur que la/les bonne(s) note(s) ont été trouvées, le problème ne serait-il pas justement que tu peux être amené a lancer l'annulation de plusieurs notes dont chaque boucle d'attente traîne longtemps ou même indéfiniment. Chaque note va faire une boucle d'attente hors, implémenté de cette manière, ce n'est pas une bonne idée de faire ça sur sur le thread JavaFX car il se trouve bloque et qui freeze toute l'interface.... et aussi met toutes les autres notes annulées en attente.

    D'ailleurs pourquoi te créer une liste synchronisée si tu ne te synchronise jamais dessus justement ? Ca ne fonctionne pas en mettant synchronized sur les méthodes, il faut synchroniser sur la liste elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List list = Collections.synchronizedList(new ArrayList());
        ...
    synchronized (list) {
        Iterator i = list.iterator(); // Must be in synchronized block
        while (i.hasNext())
            foo(i.next());
    }
    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 informatique
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut En attendant, un petit café...
    https://gitlab.com/Graphics3D/MyLittleSynth.git

    (du coup j'ai épuré le code en enlevant toute la partie graphique du projet)

    Je vais tenir compte de toutes vos réponses... C'est vrai que l'interface freeze un peu, c'est comme un brouillon qu'il faut que je mette au net.

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

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. choix sgbdr (encore!)
    Par _Gabriel_ dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 23/03/2004, 10h39
  3. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  4. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45

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