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

AWT/Swing Java Discussion :

Divers problèmes avec Swing


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Par défaut Divers problèmes avec Swing
    Je suis en train de faire un programme dans lequel j'utilise pour la gui les composants Swing les plus courants (JFrame, JMenuBar, JButton, JLabel, JPanel, JTextField, JTable etc...), et je suis confronté à pas mal de problèmes :

    Sous linux, j'ai de gros problèmes de performances (alors que mon programme n'est pas très gros), par exemple l'utilisation du JFileChooser prend bcp de ressources, etc.
    De plus, environ une fois sur deux, quand je lance mon programme, rien ne s'affiche à part le menu, et je dois cliquer par exemple sur "maximiser la fenetre" pour que les composants s'affichent. J'ai le meme problème avec les images, elles s'affichent correctement que quand par exemple on "déplace" une autre fenêtre dessus...

    Sous Windos, le programme est plus rapide et plus joli, mais idem, rien ne s'affiche au lancement, et les images ne s'actualisent pas, à moins de cliquer sur "maximiser la fenêtre"...

    Le caractère un peu aléatoire de la chose me fait penser à des bugs dans la jvm, mais c'est peut-être un peu prétencieux de ma part (je pense pas trop avoir écrit mon programme comme un cochon)

    Est-ce que qqn a une solution pour passer au dessus de ces petits problèmes ?

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Personnellement pour le problème d'affichage: tu as du écrire ton application d'une façon pas très saine (par exemple rendre la JFrameVisible puis lui ajouter les composants alors qu'il faut le faire dans l'autre sens

    Pour les images qui ne s'affichent pas j'aurais tendance à dire que tu utilises le suranné Toolki.getToolkit.getImage qui ne s'assure pas du chargement entie de l'image, remplace ces appels mar ImageIO.read, ça ira tout de suite mieux.

    Ensuite il faut voire ce que tu as codé, commence par nous montrer la classe dans la quelle tu fais le setVisible(true) sur ta JFrame.

    Ensuite suite as tu bien respecter tout ce qui concerne l'Event Dispatch Thread, sinon ça rique d'être réellement appelé programmation sagouine ^^

  3. #3
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Il est un peu difficile de t'aider avec des renseignements si vagues, sauf peut être en te disant qu'il est parfaitement possible de réaliser des applis fiables et réactives avec swing.

    Les problèmes que tu décris semblent se rapporter à des erreurs de débutants qui n'ont pas bien compris toutes les subtilités et principes décrit par exemple à Création de votre première interface graphique avec Swing. Le must des tutoriaux là dessus, mais en anglais, reste à mon avis le Creating a GUI with JFC/Swing, mais qui déborde trop largement de ton sujet. De ton coté, quels sont les guides dont tu t'es inspiré ?

    Déjà, regarde si tu ne trouves pas quelque chose avec le premier lien, sinon donne-nous des exemples de ce que tu as codé.

    En général, ces erreurs, c'est :

    - gestion des layouts et de l'ajout des composants
    - gestion du event dispatching thread.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Par défaut
    Citation Envoyé par sinok
    Personnellement pour le problème d'affichage: tu as du écrire ton application d'une façon pas très saine (par exemple rendre la JFrameVisible puis lui ajouter les composants alors qu'il faut le faire dans l'autre sens

    Pour les images qui ne s'affichent pas j'aurais tendance à dire que tu utilises le suranné Toolki.getToolkit.getImage qui ne s'assure pas du chargement entie de l'image, remplace ces appels mar ImageIO.read, ça ira tout de suite mieux.

    Ensuite il faut voire ce que tu as codé, commence par nous montrer la classe dans la quelle tu fais le setVisible(true) sur ta JFrame.

    Ensuite suite as tu bien respecter tout ce qui concerne l'Event Dispatch Thread, sinon ça rique d'être réellement appelé programmation sagouine ^^
    T'avais raison pour le setVisible

    pour les images j'utilise ImageIO.read, mais comme ca me renvoie un ImageBuffer, je me suis dit que j'allais faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image im = toolkit.createImage(bi.getSource());
    c'est ptêtre la que ça pêche...

    Pour l'event dispatch threading, non j'ai que le thread principal, jme suis dit que j'avais trop peu pour m'amuser à en faire d'autres...
    Jme suis surement foutu dedans

    C'est vrai que je crois que j'ai pas encore très bien compris toutes les subtilités de Swing, je vais lire un peu ces tutos...

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    BufferedImage est une classe héritant d'Image donc tu peux parfaitement faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image img = ImageIO.read(file);
    En ce qui concerne l'EDT c'est là que se situe le problème: tu fais tout dedans l'EDT alors que les taches lourdes doivent être réalisées en dehors (chargement d'une très grosse image, manipulations soutenues niveau bases de données ...)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Par défaut
    Citation Envoyé par sinok
    BufferedImage est une classe héritant d'Image donc tu peux parfaitement faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image img = ImageIO.read(file);

    ha ok honte à moi jai même pas vérifié ça...

    En ce qui concerne l'EDT, j'ai rien de lourd du tout, tout ce que fait mon programme pour l'instant c'est afficher une série de composants, avec la possiblité de parcourir le système de fichier, d'ouvrir une image (celle que j'utilise pour tester fait dans les 17 ko..), redimensionne cette image, et pas grand chose de plus pour l'instant...
    Aucune tâche lourde ou quoi que ce soit...

    merci pour ton aide!

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Attention la méthode proposée pour desimensionner les images dans la FAQ est passablement lourde (cell qui utilise getScaledInstance car entièrement software).

    Accessoirement le redimensionnement d'image est le genre d'opérations qui doit être réalisé dans un thread, puis l'image réincorporée dans l'edt (en l'occurence avec ton photoPanel) de la façon suivante

    exemple avec un actionPerformed
    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
     
    monBouton.addActionListener(new ActionListener() {
     
    public void actionPerformed(ActionEvent e) {
       Thread t = new Thread() {
            public void run() {
                //faire les action lourdes
                doSomethingHeavy();
     
               //réintégre l'EDT
               SwingUtilities.invokeLater(new Runnable() {
                 public void run() {
                       photoPane.setimage(...);
                 }
            }
       }
       t.start();
    });

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Par défaut
    je vais essayer ça...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Par défaut
    En fait je crois que je comprends rien à la syntaxe de ce que tu m'as écrit...

    je te donne à tout hasard mon code :
    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
     
    public void actionPerformed(ActionEvent e){
    		Object o = e.getSource();
     
    		if(o==parcourir){
    			int resultat = chooser.showOpenDialog(carteMakerFrame.this);
    			if(resultat == JFileChooser.APPROVE_OPTION){
    				File photoFile = chooser.getSelectedFile();
    				try{
    					photoImagePetit = ImageIO.read(photoFile);
    				}
    				catch(IOException ex){
    					System.out.println("Erreur lors de l'ouverture du fichier.");
    				}
     
    				photoImagePetit = redimensionnerImage(photoImagePetit);
     
    				if(vi == null){
    					vi = new VoletImage(photoImagePetit);
    					panelCreerLigne4.add(vi);
    				}
    				//une photo est déjà affichée
    				else {
    					vi.setImage(photoImagePetit);
    				}
    			}
    			else {
    				System.out.println("ouverture annulée");
    			}
    		}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Image redimensionnerImage(Image im){
    		return im.getScaledInstance(largeurMaxPhoto,hauteurMaxPhoto,Image.SCALE_DEFAULT);
    	}
    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
    class VoletImage extends JPanel{
    	private Image image;
    	public VoletImage (Image image){
    		this.image = image;
    	}
     
    	public void paint(Graphics g){
    		g.drawImage(image, 0, 0, this);
    	}
     
    	public void setImage (Image image) {
                    this.image = image;
                    this.revalidate();
                    this.repaint();
        	}
     
    }

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ton cas ça donne:

    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
     
     
    public void actionPerformed(ActionEvent e){
            Object o = e.getSource();
     
            if(o==parcourir){
                int resultat = chooser.showOpenDialog(carteMakerFrame.this);
                if(resultat == JFileChooser.APPROVE_OPTION){
                    File photoFile = chooser.getSelectedFile();
                    try{
                        photoImagePetit = ImageIO.read(photoFile);
                    }
                    catch(IOException ex){
                        System.out.println("Erreur lors de l'ouverture du fichier.");
                    }
                    Thread t = new Thread() {
     
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            super.run();
                            photoImagePetit = redimensionnerImage(photoImagePetit);
                            if(vi == null){
                                vi = new VoletImage(photoImagePetit);
                                panelCreerLigne4.add(vi);
                            }
                            //une photo est déjà affichée
                            else {
                                SwingUtilities.invokeLater(new Runnable() {
     
                                    public void run() {
                                        // TODO Auto-generated method stub
                                        vi.setImage(photoImagePetit);
                                    }
     
                                }); 
     
                            }
                        }
     
                    };
     
     
     
                }
                else {
                    System.out.println("ouverture annulée");
                }
            }
        }
    Ensuite je te conseille d'aller faire un petit tour sur le papier de gfx concernant l'EDT, il est indispensable de savoir ce que c'est et comment le manier: http://gfx.developpez.com/tutoriel/j...ing-threading/

    Une fois ceci fait tupourras mieux comprendre ce que j'ai fait ici

  11. #11
    Membre éprouvé Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Par défaut
    Citation Envoyé par ratakses
    Le caractère un peu aléatoire de la chose me fait penser à des bugs dans la jvm, mais c'est peut-être un peu prétencieux de ma part (je pense pas trop avoir écrit mon programme comme un cochon)
    " - Il s'appelle Juste Leblanc.
    - Ah bon il a pas de prénom ? "

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/03/2009, 22h15
  2. Divers problème avec mon code
    Par SiOuZ dans le forum SDL
    Réponses: 1
    Dernier message: 07/02/2009, 00h23
  3. [Postfix] Divers problèmes avec pop3
    Par Atikae dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 14/09/2007, 14h28
  4. divers problèmes avec wxwidgets
    Par altadeos dans le forum wxWidgets
    Réponses: 4
    Dernier message: 08/02/2006, 09h36
  5. divers problème avec Java et jdbc
    Par chti_juanito dans le forum JDBC
    Réponses: 28
    Dernier message: 31/10/2005, 16h54

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