[Java,Swing] attendre fermeture JFrame
Résolu
KX
Messages postés
16761
Date d'inscription
Statut
Modérateur
Dernière intervention
-
arth Messages postés 9374 Date d'inscription Statut Contributeur Dernière intervention -
arth Messages postés 9374 Date d'inscription Statut Contributeur Dernière intervention -
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 :
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:
- [Java,Swing] attendre fermeture JFrame
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
1 réponse
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?
- 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?
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)
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.
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)
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é...
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);