Swing gestion des fenêtres

Résolu
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014 - 30 avril 2014 à 21:04
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 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é

12 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
1 mai 2014 à 20:19
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
1
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
Modifié par cs_Julien39 le 5/05/2014 à 14:58
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();
    }
});
1
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 mai 2014 à 16:03
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();
1
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
1 mai 2014 à 22:14
Merci je regarde et je te dit ca demain.
Bonne soirée

merci de ton temps
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
3 mai 2014 à 17:38
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.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 mai 2014 à 08:16
Salut,

Normalement, toFront() devrait fonctionner, peux tu me montrer ton code ?
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
5 mai 2014 à 08:51
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 ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 mai 2014 à 09:50
Je ne comprend pas ce que signifie "ca ne marche pas depuis le JDesktopPane" ?
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
5 mai 2014 à 10:06
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.
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
5 mai 2014 à 15:10
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
0
seichan94 Messages postés 38 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 6 novembre 2014
5 mai 2014 à 16:11
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. :)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 mai 2014 à 07:55
Ok pas de problèmes.

peux tu marquer le sujet comme résolu stp ?
a+
0
Rejoignez-nous