OVH Cloud OVH Cloud

La liste de toutes les fenêtres ouvertes

9 réponses
Avatar
Black Myst
Salut,

J'aurrais besoin de connaître la liste de toutes les instances de JFrame
et JDialog créer par mon application.
Le problème c'est que je ne trouve pas la méthode qui va bien.

Actuellement, j'ajoute à une liste chaînée toutes les instances que je
créer, mais cette solution n'est pas satifaisante pour plusieurs raisons
- c'est vraiment moche dans le code
- gros risque d'oublie (surtout lorsqu'on ouvre un JFileChooser ou un
OptionPane)
- Certaines fenêtres sont ouverte par des API externe comme JavaHelp qui
ouvre une fenêtre sans vous donner sa référence.
- gros risque d'oublie (je sais mais c'est vraiment un gros risque)

Alors, possible ou pas ?

Merci d'avance.
Black Myst

9 réponses

Avatar
tomcat
Black Myst wrote:
Salut,

J'aurrais besoin de connaître la liste de toutes les instances de JFrame
et JDialog créer par mon application.
Le problème c'est que je ne trouve pas la méthode qui va bien.

Actuellement, j'ajoute à une liste chaînée toutes les instances que je
créer, mais cette solution n'est pas satifaisante pour plusieurs raisons
- c'est vraiment moche dans le code
- gros risque d'oublie (surtout lorsqu'on ouvre un JFileChooser ou un
OptionPane)
- Certaines fenêtres sont ouverte par des API externe comme JavaHelp qui
ouvre une fenêtre sans vous donner sa référence.
- gros risque d'oublie (je sais mais c'est vraiment un gros risque)

Alors, possible ou pas ?


Je pense qu'un truc de ce genre devrait faire l'affaire :

//Récupération de tous les composants de la Frame principale
Components[] liste = maFrame.getComponents();
//itération sur ces composants
for (int i = 0; i < liste.length; i++){
if (liste[i] instanceof JFrame){
//traitement dans le cas où c'est une JFrame
}
else if (liste[i] instanceof JDialog){
//traitement dans le cas où c'est un JDialog
}
}

Merci d'avance.
de rien

Black Myst


Avatar
Black Myst
Je pense qu'un truc de ce genre devrait faire l'affaire :

//Récupération de tous les composants de la Frame principale
Components[] liste = maFrame.getComponents();
//itération sur ces composants
for (int i = 0; i < liste.length; i++){
if (liste[i] instanceof JFrame){
//traitement dans le cas où c'est une JFrame
}
else if (liste[i] instanceof JDialog){
//traitement dans le cas où c'est un JDialog
}
}

interressant, mais je ne crois pas que tu ai compris mon problème : je

ne cherche pas les sous-fenêtres de ma fenêtre, mais toutes les fenêtres
qui ont été ouvertes.

Mon prog est en fait composé de module très différent qui se comporte un
peu comme des programme autonome dans une même JVM, impossible dans ses
condition de définir de Fenêtre principal, ni de lien entre ces fenêtres.

Ton algo permets de récupérer les JDialog qui sont associé à une JFrame
parente, pas de trouver toutes les JFrames ouvert.

Une autre idée ?

Black Myst

Avatar
Vincent Cantin
interressant, mais je ne crois pas que tu ai compris mon problème : je
ne cherche pas les sous-fenêtres de ma fenêtre, mais toutes les fenêtres
qui ont été ouvertes.

Mon prog est en fait composé de module très différent qui se comporte un
peu comme des programme autonome dans une même JVM, impossible dans ses
condition de définir de Fenêtre principal, ni de lien entre ces fenêtres.

Ton algo permets de récupérer les JDialog qui sont associé à une JFrame
parente, pas de trouver toutes les JFrames ouvert.

Une autre idée ?

Black Myst


J'ai bien une idee, mais je sens qu'on ne va pas l'aimer :
termine ton programme, et si la JVM ne s'arrete pas, c'est qu'il reste des
fenetres ouvertes :-D

.. je sais, je sais, c'etait pas drole
Vincent

Avatar
jocelyn
Salut,

Comment lances-tu ces fameux modules ? Il me semble que c au moment du
lancement
qu'on devrait pouvoir stocker une reference ?

--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même
Avatar
Black Myst
jocelyn wrote:
Salut,

Comment lances-tu ces fameux modules ? Il me semble que c au moment du
lancement
qu'on devrait pouvoir stocker une reference ?


Oui, c'est en gros ce que je fais, mais ca implique que tous les futurs
programmeurs qui vont écrire de nouveau modules vont penser à me
signaler toutes leurs nouvelles fenêtres. Actuellement c'est ecrit dans
la doc (à plusieur endroits)... mais je ne crois pas que ce sera suffisant.
Le pire, c'est qu'en cas d'oublie l'effet n'est pas du tout visible
immédiatement... et ca pourrait faire un vilain bug.

Donc j'aimerais vraiment connaitre "a chaud" les fenetres ouvertes !

Avatar
Mat Free
Comment lances-tu ces fameux modules ? Il me semble que c au moment du
lancement
qu'on devrait pouvoir stocker une reference ?


Oui, c'est en gros ce que je fais, mais ca implique que tous les futurs
programmeurs qui vont écrire de nouveau modules vont penser à me signaler
toutes leurs nouvelles fenêtres. Actuellement c'est ecrit dans la doc (à
plusieur endroits)... mais je ne crois pas que ce sera suffisant.


Suffit de leur fournir des classes héritant de JFrame et JDialog
qui comptabilise automatiquement le nombre d'instances via une
variable de type static. Après le comptage sera très simple.

Le pire, c'est qu'en cas d'oublie l'effet n'est pas du tout visible
immédiatement... et ca pourrait faire un vilain bug.

Donc j'aimerais vraiment connaitre "a chaud" les fenetres ouvertes !


--
Mat


Avatar
zazoun2
Bonjour,

Il est possible d'obtenir la liste de toutes les frames créées par une
application avec la méthode static java.awt.Frame[]
java.awt.Frame.getFrames().

Cette méthode ne retourne évidemment pas les JDialog, Dialog, JWindow
etc crées par l'application. Par contre, en fouinant un peu dans le
code de JDialog et JWindow, que les fenêtres Swing appartiennent
forcément à une Frame, qui peut être l'instance
SwingUtilities.getSharedOwnerFrame() (d'ailleurs dans la liste de
JFrame retournée pas Frame.getFrames()).

Donc, si tes développeurs utilisent uniquement des fenêtres Swing, à
partir des JFrame retournées par Frame.getFrames(), et en utilisant la
méthode Window[] Window.getOwnedWindows() récursivement, tu dois
pouvoir obtenir la liste de toutes les fenêtres d'une application.

Zazoun
Avatar
Black Myst
Zazoun wrote:
Bonjour,

Il est possible d'obtenir la liste de toutes les frames créées par une
application avec la méthode static java.awt.Frame[]
java.awt.Frame.getFrames().

Cette méthode ne retourne évidemment pas les JDialog, Dialog, JWindow
etc crées par l'application. Par contre, en fouinant un peu dans le
code de JDialog et JWindow, que les fenêtres Swing appartiennent
forcément à une Frame, qui peut être l'instance
SwingUtilities.getSharedOwnerFrame() (d'ailleurs dans la liste de
JFrame retournée pas Frame.getFrames()).

Donc, si tes développeurs utilisent uniquement des fenêtres Swing, à
partir des JFrame retournées par Frame.getFrames(), et en utilisant la
méthode Window[] Window.getOwnedWindows() récursivement, tu dois
pouvoir obtenir la liste de toutes les fenêtres d'une application.

Zazoun


Merci beaucoup, ca marche nickel, j'ai pu faire ce que je voullais.

Avatar
sourria
Black Myst a écrit le 27/07/2004 à 01h09 :
Salut,

J'aurrais besoin de connaître la liste de toutes les instances de JFrame

et JDialog créer par mon application.
Le problème c'est que je ne trouve pas la méthode qui va bien.

Actuellement, j'ajoute à une liste chaînée toutes les
instances que je
créer, mais cette solution n'est pas satifaisante pour plusieurs
raisons
- c'est vraiment moche dans le code
- gros risque d'oublie (surtout lorsqu'on ouvre un JFileChooser ou un
OptionPane)
- Certaines fenêtres sont ouverte par des API externe comme JavaHelp qui

ouvre une fenêtre sans vous donner sa référence.
- gros risque d'oublie (je sais mais c'est vraiment un gros risque)

Alors, possible ou pas ?

Merci d'avance.
Black Myst


Window[] frames = JFrame.getWindows();

for(int i = 0; i < frames.length; ++i)
{
if(frames[i] instanceof JFrame)
{
// code.........
//frames[i].setVisible(false);
}
if(frames[i] instanceof JDialog )
{
// code.........
frames[i].setVisible(false);
}

}