[Java,Swing] attendre fermeture JFrame [Résolu/Fermé]

Signaler
Messages postés
15929
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 juillet 2020
-
Messages postés
9366
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
-
Bonjour,

Dans un petit code Java je charge une image dans une JFrame, ce que je voudrais c'est que dès que je clique dessus, la fenêtre se ferme, et mon programme continue (le but étant de récupérer les coordonnées du pixel cliqué pour ensuite traiter l'image).

Le problème c'est qu'une fois la fenêtre affiché, soit le programme continue et la fenêtre se ferme avant d'attendre le clic, soit la fenêtre ne se ferme jamais et le programme ne passe pas à la suite.

Voici mon code simplifié, merci de m'indiquer comment je pourrais le corriger :

public class Test 
{
public static void main(String...args) throws InterruptedException
{
    JFileChooser chooser = new JFileChooser();
    chooser.showOpenDialog(null);
    
    final  Dimension dim = new Dimension(-1,-1);
    
    {
        JFrame frame = new JFrame("Facebook Images");
        frame.setSize(500,500);
        frame.setResizable(false);
        
        final JScrollPane scroll = new JScrollPane(new JLabel(new ImageIcon(chooser.getSelectedFile().getAbsolutePath())));
        
        scroll.addMouseListener(new MouseListener()
        {
            public void mouseClicked(MouseEvent e)
            {
                dim.setSize(
                    e.getX()+scroll.getHorizontalScrollBar().getValue(),
                    e.getY()+scroll.getVerticalScrollBar().getValue());
                
                //dim.notify(); // signal de fermeture de la fenêtre
            }
            
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
        });
        
        frame.add(scroll);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.setVisible(true);
        
        //dim.wait(); // attente de la fermeture de la fenêtre
        
        frame.setVisible(false);
        frame = null;
    }
    
    System.out.println(dim);
}
}

1 réponse

Messages postés
9366
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 244
Si j'ai bien compris :

- Un FileChooser demande quel fichier ou veut ouvrir
- Une fois le fichier sélectionné Le FileChooser se ferme
- On créer une Frame de taille 500²
- On y ajoute un ScrollPane qui contient l'image ?
- Un clique sur un pixel de l'image
- On ferme la Frame et on démarre le traitement.

C'est ça?
Messages postés
15929
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 juillet 2020
2 628
Sur le principe, c'est ça que je cherche, mais proprement :(
D'autant qu'ici, status devra être final pour être modifié dans mouseClicked, ce qui du coup l'empêchera d'être modifié...
Messages postés
9366
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 244
Bah c'est peut être pas considéré propre mais je pense tout à fait fonctionnel.

Dans ce cas cas pourquoi ne pas :

Créer une classe héritée de Thread qui prend en paramètre le ScrollPane :
Dans cette classe Thread c'est là qu'on ajoute le MouseListener qui retourne la valeur de dim

Puis dans la classe Test :

dim.setSize(new WaitEvent(scrollPane).getDim());

Enfin après je ne sais pas si ça marcherait :-D
Messages postés
9366
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 244
Bon c'est un peu un connerie ce que je raconte, c'est normalement le but des Listener de faire des actions en fonctions des évènements.

A mon avis à moins d'un bricolage, il faut le faire là où c'est prévu.
Messages postés
15929
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 juillet 2020
2 628
Bon, ce n'est pas encore vraiment ce dont tu parlais, mais ça marche avec :

1) le programme démarre un thread qui attend indéfiniment
2) un listener qui tue le thread
3) le programme qui attend qu'il meurt

Merci de ton aide ;-)

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class Test 
{
public static void main(String...args) throws InterruptedException
{
    JFileChooser chooser = new JFileChooser();
    chooser.showOpenDialog(null);
    
    final Point centre = new Point(-1,-1);
    
    {
        final JFrame frame = new JFrame("Facebook Images");
        frame.setSize(500,500);
        frame.setResizable(false);
        
        final JScrollPane scroll = new JScrollPane(new JLabel(new ImageIcon(chooser.getSelectedFile().getAbsolutePath())));
            
        final Thread thread = new Thread()
        {
            public void run()
            {
                try { Thread.sleep(Long.MAX_VALUE); } catch (Exception e) {}
            }
        };
        
        scroll.addMouseListener(new MouseListener()
        {
            public void mouseClicked(MouseEvent e)
            {
                centre.setLocation(
                    e.getX()+scroll.getHorizontalScrollBar().getValue(),
                    e.getY()+scroll.getVerticalScrollBar().getValue());
                                    
                thread.interrupt();
            }
            
            public void mouseEntered(MouseEvent arg0) {}
            public void mouseExited(MouseEvent arg0) {}
            public void mousePressed(MouseEvent arg0) {}
            public void mouseReleased(MouseEvent arg0) {}
        });
        
        frame.add(scroll);                            
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        
        thread.start();
        frame.setVisible(true);
        
        try { thread.join(); } catch (Exception e) {}
        frame.dispose();
    }
    
    System.out.println(centre);
}
}
Messages postés
9366
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 244
Connaissais pas le .join() :-)