Swing gestion des fenêtres [Résolu]

seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 30 avril 2014 à 21:04 - Dernière réponse : cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention
- 6 mai 2014 à 07:55
Bonjour,

Je souhaite en savoir plus sur la gestion du passage d'un "JPanel a un autre"

mon application commence avec une JFrame qui contient un JPanel
je souhaite passer de la JPane A à B ou C avec l'utilisation d'un Menu ou un bouton ou le resultat d'un action

quel est le meilleur moyen de contrôler proprement c'est changement
sachant que si je passe de A à B et que commence a remplir un formulaire je souhaite que lorsque je quitte une des JPanel il soit possible d'etre réinitialisé

vous voyez le truc ?
Bon je suis sur qu'il y a quelque chose de propre a faire...

j'ai déjà commencé avec :
JFrame qui contient un CardLAyout avec les JPanel principaux.
puis si besoin dans mes JPanel j'ai ajouté d'autres CardLayout pour passé d'un JPanel de secondaire a l'autre .

j'utilise le pattern observer avec une Map<int numeroPan, JPanel>

pour faire un update en fonction des actions réalisé
j'utilise un AbstractControler qui contient tout les méthodes possible que je puissent exécuter, bref cela semble lourd il doit y avoir plus simple et propre

merci d'avance pour votre aide

PS : si vous avez une petite application un petit zip de démo avec genre des formulaire des JTable et autre interface je voudrais bien voir un programme bien développé
Afficher la suite 

12 réponses

Répondre au sujet
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 1 mai 2014 à 20:19
+1
Utile
Salut,

Ce mode de fonctionnement des application est assez ancien est est hérité des premiers ordinateurs qui ne pouvaient gérer qu'un seul écran de présentation.

Aujourd'hui, tu peux réaliser des choses plus jolies, plus simples et plus efficaces en faisant une application multi-fenêtrée.

Pour cela, tu peux utiliser des JinternalFrame à insérer dans un JDesktopPane. Regarde cet exemple, c'est très simple et très bien expliqué : http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html

Si cela ne te convient pas, dis le moi, on reparlera de ton application
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - Modifié par cs_Julien39 le 5/05/2014 à 14:58
+1
Utile
Une première remarque : Créer un bouton juste pour ramener une fenêtre au premier plan ne sert à rien, il vaut mieux directement cliquer sur la fenêtre plutot que sur un bouton.

Deuxième chose : Si la fenêtre a été fermée par l'utilisateur, cela ne fonctionnera plus.

Troisième chose : c'est toFront() qu'il faut utiliser et non moveToFront()

Dernière chose : tu gères mal les listeners, ta facon de faire date de l'ancien fonctionnement de Swing qui gérait assez mal les événements.

Il faut affecter le listener au bouton qui le déclenche :
this.btA = new JButton("A");
this.btB = new JButton("B");
btA.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        desktop.getInternalFrameA().toFront();
    }
});
btB.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        desktop.getInternalFrameB().toFront();
    }
});
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 5 mai 2014 à 16:03
+1
Utile
Mon premier message avait pour but de te faire dévier de l'objectif parce qu'aujourd'hui, on n'utilise plus un écran unique.

Si c'est vraiment ce que tu veux faire, il faut que tu gères tes JPanel un par un que tu ajoutes dans une JFrame. Il faudra dans ce cas générer le défilement des JPanel manuellement.

JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
frame.add(panel1);

//Pour passer du panel 1 au panel 2 :
frame.getContentPane().remove(panel1);
frame.add(panel2);
frame.validate();
frame.repaint();
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 1 mai 2014 à 22:14
0
Utile
Merci je regarde et je te dit ca demain.
Bonne soirée

merci de ton temps
Commenter la réponse de seichan94
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 3 mai 2014 à 17:38
0
Utile
Bonjour cs_Julien39

j'ai fait quelques test avec les JDesktop et JInternalFrame
c'est pas mal du tout !
par contre je comprend pas trop comme gere la mise en avant/arriere des JInternalFrame avec moveToFront ou toFront....

j'ai fait une simple structure frame->JDesktopPane->Jinternalframe x2 (A et B)
dans ma JDesktop j ai ajouté un Actionlistener sur 2 bouton A et B qui exécute :

this.intFrameA.toFront(); ou moveToFront();
mais rien ne ce passe :(

de plus c'est pas top comme moyen de gestion je pense que mon JDesktop doit implémenté un JInternalFrame Listener un truc comme ça qui doit me permettre de faire des update en fonction des action commande un peut comme un observateur... ?

bref je regarde la doc mais sur ce point c'est assez vague ou je regarde pas comme il faut...

Merci pour ton aide.
Commenter la réponse de seichan94
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 5 mai 2014 à 08:16
0
Utile
Salut,

Normalement, toFront() devrait fonctionner, peux tu me montrer ton code ?
Commenter la réponse de cs_Julien39
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 5 mai 2014 à 08:51
0
Utile
Bonjour cs_Julien39,

effectivement ça fonctionne mais pas depuis la JDesktop.
J'ai placer mon ActionObservable dans ma Frame qui contient la JDesktop et la c'est ok.

MaFrame.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MaFrame extends JFrame implements ActionListener {

/**
*
*/
private static final long serialVersionUID = -5449301750930787694L;
private Desktop desktop;
private JButton btA;
private JButton btB;
private JPanel panBoutons;

public MaFrame() {
this.setSize(800, 600);
this.setBackground(Color.blue);
this.setVisible(true);
this.setLocationRelativeTo(null);
this.setTitle("Ma Frame");
this.setLayout(new BorderLayout());

this.desktop = new Desktop();

this.btA = new JButton("A");
this.btB = new JButton("B");
this.btA.addActionListener(this);
this.btB.addActionListener(this);

this.panBoutons = new JPanel();
this.panBoutons.add(btA, BorderLayout.WEST);
this.panBoutons.add(btB, BorderLayout.EAST);

this.add(desktop, BorderLayout.CENTER);
this.add(this.panBoutons, BorderLayout.NORTH);
}

@Override
public void actionPerformed(ActionEvent arg0) {
if(arg0.getActionCommand().equals("A")) {
this.desktop.getInternalFrameA().moveToFront();
} else if(arg0.getActionCommand().equals("B")) {
this.desktop.getInternalFrameB().moveToFront();
}
}
}
Desktop.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.beans.PropertyVetoException;

import javax.swing.JDesktopPane;


public class Desktop extends JDesktopPane {

/**
*
*/
private static final long serialVersionUID = -1565524468732451452L;
private IntFrame internalFrameA;
private IntFrame internalFrameB;

public Desktop() {
this.setBackground(Color.green);

this.internalFrameA = new IntFrame(Color.yellow, 1);
this.internalFrameB = new IntFrame(Color.red, 2);

this.add(this.internalFrameA, BorderLayout.CENTER);
this.add(this.internalFrameB, BorderLayout.CENTER);

try {
this.internalFrameA.setMaximum(true);
this.internalFrameB.setMaximum(true);
} catch (PropertyVetoException e1) {
e1.printStackTrace();
}

this.internalFrameA.toFront();
}

public IntFrame getInternalFrameA() {
return internalFrameA;
}

public void setInternalFrameA(IntFrame internalFrameA) {
this.internalFrameA = internalFrameA;
}

public IntFrame getInternalFrameB() {
return internalFrameB;
}

public void setInternalFrameB(IntFrame internalFrameB) {
this.internalFrameB = internalFrameB;
}
}
IntFrame.java
import java.awt.Color;

import javax.swing.JInternalFrame;


public class IntFrame extends JInternalFrame {

/**
*
*/
private static final long serialVersionUID = 4546649357556755344L;

public IntFrame(Color color, int n) {
//this.isMaximum();
this.setBackground(color);
this.setTitle("Internal Frame :"+n);
this.setVisible(true);
this.setResizable(true);
this.setLocation(0, 0);
this.setBorder(null);

}
}

voila le code
peut être que je devrais faire un singleton ou un contrôleur (singleton) pour gérer l'affichage de mes JInternalFrame ?
Commenter la réponse de seichan94
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 5 mai 2014 à 09:50
0
Utile
Je ne comprend pas ce que signifie "ca ne marche pas depuis le JDesktopPane" ?
Commenter la réponse de cs_Julien39
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 5 mai 2014 à 10:06
0
Utile
Ah oui pardon j'ai oublié de tes donner les détails >_<"

ce code fonctionne, mais si je place le ActionListener dans Desktop.java ainsi que les 2 boutons que l'on écoute alors ça ne fonctionne plus.

en gros, un this.getInternalFrameA().toFront() sur une action de bouton ne fonctionne pas, j'ai ajouté des trace pour vérifié qu'il exécute bien mon actionListener du bouton, et je n'ai pas d'erreur juste aucun changement.

mais ce qui m'intéresse plus c'est de savoir comme je doit gérer les actions vis à vis du changement de JInternalFrame,
-----------------------------------------------------------------------------------
par exemple si je clic sur un bouton, menu je doit faire un : getDesktop.getMonInternalFrame.toFront()
-----------------------------------------------------------------------------------
ou alors un truc comme :
GUI gui = new GUI()
AbstractCtrlGuit absGUI = new CtrlGUIT(gui);
puis dans mes boutons :
AbstractControleurDesktop.showIFrame(MonInternalFrame)

ou autre chose ???

Merci encore pour ton temps.
Commenter la réponse de seichan94
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 5 mai 2014 à 15:10
0
Utile
Merci pour tes remarques,

pour ta première remarque, min idée est la suivante :

j'ai un formulaire login/mot de passe est un bouton "submit"
si je clic sur "submit" est que le login et passe sont valide je veux que l'écran affiche le compte utilisateur par exemple.

je ne veux pas que l'utilisateur puissent faire quoi que ce soit autrement qu'avec un clic sur submit

quel type de conteneur je doit utiliser donc avec quel moyen contrôler le passage du formulaire au compte utilisateur à l'écran ?

je repose ma question différemment car je sens que je dérive de l'objectif et j'ai peur de faire autre chose que ce que je veux réellement

dans tous les cas merci
Commenter la réponse de seichan94
seichan94 38 Messages postés mardi 29 octobre 2013Date d'inscription 6 novembre 2014 Dernière intervention - 5 mai 2014 à 16:11
0
Utile
Ah ok c'est bien ce dont j'avais peur :(

Bon toujours est il que j'ai beaucoup appris grâce à toi et te remercie beaucoup, du coup je vais continué sur ta méthode même si ce n'était pas l'idée de départ.

Peut être que j'aurais d'autre questions... mais pour le moment tu as répondu a toutes mes question, je ferme le topic.

A une prochaine fois, Merci.
Bonne fin de journée. :)
Commenter la réponse de seichan94
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 6 mai 2014 à 07:55
0
Utile
Ok pas de problèmes.

peux tu marquer le sujet comme résolu stp ?
a+
Commenter la réponse de cs_Julien39

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.