[Java,Swing] attendre fermeture JFrame

Résolu/Fermé
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 13 sept. 2012 à 20:16
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 - 14 sept. 2012 à 00:43
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);
}
}
A voir également:

1 réponse

arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
13 sept. 2012 à 22:48
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?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 13/09/2012 à 23:03
Tout à fait, la seule chose qui m'intéresse c'est le pixel sur lequel je clique (mon objet Dimension dim).
Le problème c'est que soit je n'ai jamais d'objet final (celui que j'affiche) soit j'obtient l'objet initial (-1,-1).
Je n'arrive pas à fermer la fenêtre après un seul clic (quand je remets les deux lignes commentées)
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
13 sept. 2012 à 23:18
Pour récupérer la position du clic :

A partir d'un composant avec MouseEvent

En enregistrant un MouseEvent auprès de votre composant graphique, vous pouvez avoir accès à la position de la souris relativement à ce composant. Il vous suffira ensuite d'utiliser la méthode getLocationOnScreen() de Component pour calculer la position de la souris par rapport à l'écran.


int x = (int)(mouseEvent.getPoint().getX() + monComposant.getLocationOnScreen().getX());
int y = (int)(mouseEvent.getPoint().getY() + monComposant.getLocationOnScreen().getY());

Vous pouvez aussi utiliser la méthode convertPointToScreen() de la classe javax.swing.SwingUtilities. Par exemple :


MouseEvent event = ...;
Component composant = ...;
Point locationComposant = event.getPoint();
Point locationEcran = SwingUtilities.convertPointToScreen(locationComposant, composant);


Tiré de : https://java.developpez.com/faq/gui?page=La-souris-et-le-clavier

Si c'était moi :

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)
{
int x = (int)(e.getPoint().getX() + scroll.getLocationOnScreen().getX());
int y = (int)(e.getPoint().getY() + scroll.getLocationOnScreen().getY());

dim.setSize(x,y);

frame.setVisible(false);
....
// Traitement sur l'image
....
closeProgram();
}

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.EXIT_ON_CLOSE);
frame.setVisible(true);
}

.....
.....

public void closeProgram()
{
frame.dispose();
System.exit(0);
}

Après c'est en considérant je pense que l'on clique bien sur le ScrollPane et non à côté de la Frame.
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
13 sept. 2012 à 23:18
Enfin, si j'ai tout compris ...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
13 sept. 2012 à 23:45
Déjà, il n'y a pas de problème au niveau des coordonnées que j'ai dans mon objet dim, elles correspondent bien à ce que je veux

Le soucis c'est que je ne veux pas faire "// Traitement sur l'image" à l'intérieur de mon code mouseClicked, mais bien à la suite de mon code.

J'ai donc besoin d'un mécanisme, qui permette d'attendre que la fenêtre soit fermée avant d'atteindre le code de traitement image (mon affichage de dim dans mon code)

frame.setVisible(true);

// attendre l'instruction frame.dispose (la fin du mouseClicked)

System.out.println(dim); // Traitement sur l'image

Le problème de l'attente, je l'ai essayé avec wait et notify (à chaque fois que j'essaye de les caser ceux là, ils ne font jamais ce que je veux ^^' ) mais aussi avec des Threads, ou des Sockets. Mais c'est toujours pareil, soit mon affichage de dim est appellé avant que j'ai cliqué, soit il n'est jamais appelé...
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
13 sept. 2012 à 23:48
Du coup je ferais un truc pourri comme : (^.^)

boolean status = false.

.......
.......
dim.setSize(x,y);
status=true;
.......
.......

frame.setVisible(true);

While(!status)
Thread.sleep(1000);

frame.setVisible(false);
frame = null;
}

System.out.println(dim);
0