Comment passer un argument entre deux JFrames

Fermé
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014 - 16 nov. 2011 à 14:14
choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 - 18 nov. 2011 à 07:44
Bonjour à tous,je reviens avec mon problème de passage de paramètre entre deux JFrame,j'ai amenagé mon code peut-être qu'une bonne volonté pourra m'aider cette fois ci.
J'ai un JFrame nommée (FormChoixRegistre1) contituée d'un Jtable d'une colonne et contenant quelque données. Je voudrais arriver à remplir un combox du 2ème Jframe nommé (FormANaiss1) avec les données du JTable.
Pour cela,jai crée une référence de FormANaiss1 et je l'ai passée en parametre du constructeur de
FormChoixRegistre1 comme ceci :

public final class FormChoixRegistre1 extends javax.swing.JFrame { 
    private FormANaiss1 formNaiss; //reference à FormANaiss1
    private int colNo;
    private Object objects[];
    /** Creates new form FormChoixRegistre */
    public FormChoixRegistre1(FormANaiss1 fan) { //contructeur parameter avec la JFrame FormANaiss1
        this.formNaiss=fan;
        initComponents();
        setResizable(false);
        setLocationRelativeTo(null);
        listeRegistre();
        TxtNbRegistreDispo.setText(Integer.toString(aModel.getRowCount()));
    }

Et voici le code de la 2eme JFrame

public final class FormANaiss1 extends javax.swing.JFrame {
    /** Creates new form FormANaiss */
private javax.swing.JComboBox CmbCodeRegistre;
    public FormANaiss1() {
       
       
        initComponents();
        setSize(807, 645);
        setLocationRelativeTo(null); 
    }
Private void  initComponents(){
} 
public void setRegistres(Object reg) {//setter de remplisage du combobox
        this.CmbCodeRegistre.addItem(reg);
    }
}

Et à partir de là je suis un peu perdu,je ne sais plus comment faire pour récuperer les données dans le combo.et Pourtant il faut que j'arrive à vaincre cette difficulté,et ce ne sera pas le cas sans l'aide des uns et des autres.Merci pour votre comprehension.
A voir également:

10 réponses

choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 2 101
16 nov. 2011 à 14:25
Bonjour

Etant donné que ta deuxième frame est un attribut de la première, rien de plus simple. La première peut faire appel à toutes les méthodes publiques de la deuxième et passer tous les arguments nécessaires.

En l'occurence dans la JFrame FormChoixRegistre1 :

fan.setRegistres(objects);
0
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014
16 nov. 2011 à 14:37
Merci pour ta reponse Choubaka;voici ce que j'ai fait:

private void CmdQuitterActionPerformed(java.awt.event.ActionEvent evt) {                                           
        final int[] rep = new int[1];
        rep[0] = JOptionPane.showConfirmDialog(null, "Voulez-vous vraiment quitter cette fenêtre?", "Quitter", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        if (rep[0] == JOptionPane.YES_OPTION) //System.exit(6);
        {
          for(int i=0;i<bModel.getRowCount();i++){
              formNaiss.setRegistres(bModel.getValueAt(i, colNo));//je rempli le combo par la methode setRegistres().
          }
            this.setVisible(false);
        }

    }     
maintenant comment j'utilise cette methode dans le constructeur de FormANaiss1 pour alimenter le combo?
0
choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 2 101
16 nov. 2011 à 14:50
si tu dois remplir le combo avec le constructeur, tu dois revoir le moment où tu va faire appel au constructeur.

Personnellement, je modifierais le constructeur de la première frame en enlevant l'arguement demandé:

public FormChoixRegistre1()

Je modifie ensuite le constructeur de la deuxième frame qui prendrait ce qu'il a besoin en argument pour remplir la combo. Modifie aussi initComponents en conséquence.

public FormANaiss1(Object[] objects) {


initComponents(objects);
setSize(807, 645);
setLocationRelativeTo(null);
}
Private void initComponents(){

dans cette méthode tu remplis ta combo.

}

Il te suffiras de modifier la manière d'instancier la deuxième fenêtre dans le constructeur de la première:


"this.formNaiss=fan" devient "fan = new formNaiss(objects);


0
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014
16 nov. 2011 à 15:17
Quand vous dites :(Je modifie ensuite le constructeur de la deuxième frame qui prendrait ce qu'il a besoin en argument pour remplir la combo. Modifie aussi initComponents en conséquence. )
Ce constructeur à besoin FormChoixRegistre1,ou du moins du model du Jtable de FormChoixRegistre1 pour remplir le combo.


public FormANaiss1(Object[] objects) { /* que represente objects dans ce constructeur ?le Jfarme FormChoixRegistre1 ou le model du JTable,ou est ce qu'il peut se substitué au deux ? */


initComponents(objects);
setSize(807, 645);
setLocationRelativeTo(null);
}

Private void initComponents(){

dans cette méthode tu remplis ta combo. /* comment puis-je remplir le combo si j'ai aucune reference de FormChoixRegistre1 ? enfin,c'est ce que je penses*/

}

merci pour votre comprehension
0

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

Posez votre question
choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 2 101
16 nov. 2011 à 15:30
Je vais essayer d'être plus clair

Tu dois mettre l'argument (quel qu'il soit) nécessaire pour remplir le combo dans le constructeur de FormANaiss1.

Cet argument vient forcément de FormChoixRegistre1 qui instancie FormANaiss1 à partir de son propre constructeur.

Dans le constructeur de FormANaiss1, tu fais appel à une méthode "initComponents".
Dans le corps de cette méthode, tu remplis la combo.

Cette méthode doit être réécrite pour qu'elle prenne en argument les paramètres pour remplir cette combo.

En l'occurence l'arguement reçu via le constructeur de FormANaiss1.

ce qui donne ceci

public FormANaiss1(Object[] objects) { /* j'ai nommé l'argument en tableau d'objet mais tu peux mettre ce que tu as besoin, c'est un exemple.

initComponents(objects);
setSize(807, 645);
setLocationRelativeTo(null);
}

Private void initComponents(Object[] objects){

// ici le code d'initialisation du combo avec l'utilisation de objects qui provient en fait de FormChoixRegistre1

}




0
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014
16 nov. 2011 à 16:14
vraiment choubaka,excuse moi de ne pas bien vous comprendre,vous dites:

Personnellement, je modifierais le constructeur de la première frame en enlevant l'arguement demandé:

public FormChoixRegistre1()

donc ce constructeur n'a plus aucun parametre,alors quand vous me dite par la suite :

Il te suffiras de modifier la manière d'instancier la deuxième fenêtre dans le constructeur de la première:

"this.formNaiss=fan" devient "fan = new formNaiss(objects);

je ne sais plus trop,d'où vient "fan " puisque le constructeur est vide
voici mon code que j'ai modifié suivant tes instructions:

public final class FormChoixRegistre1 extends javax.swing.JFrame {

private FormANaiss1 formNaiss; //reference à FormANaiss1
private int colNo;
private Object objects[];

/** Creates new form FormChoixRegistre */
public FormChoixRegistre1() {
formNaiss = new FormANaiss1(objects); //c'est bien formNaiss ici non?
initComponents();
setResizable(false);
setLocationRelativeTo(null);
listeRegistre();
TxtNbRegistreDispo.setText(Integer.toString(aModel.getRowCount()));

}
}
0
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014
16 nov. 2011 à 16:59
quand vou dite aussi :
Je modifie ensuite le constructeur de la deuxième frame qui prendrait ce qu'il a besoin en argument pour remplir la combo. Modifie aussi initComponents en conséquence.

public FormANaiss1(Object[] objects) {


initComponents(objects);
setSize(807, 645);
setLocationRelativeTo(null);
}
Private void initComponents(){

dans cette méthode tu remplis ta combo.

}

puis-je remplacer les parametres (Object[] objects) de ce contructeur par quelque chose du genre:

private FormChoixRegistre1 formReg;
public FormANaiss1(FormChoixRegistre1 fcr) {
this.formReg=fcr;/*afin de pouvoir l'utiliser dans ma methode qui chargera le combo?autrement je ne voit pas trop comment je pourais acceder aux données de FormChoixRegistre1 */
initComponents(frc.getDefaultModele); //getDefaultModele retourne le model de la table dans FormChoixRegistre1
setSize(807, 645);
setLocationRelativeTo(null);
}
Private void initComponents(){

private void remplirCombo(DefaultTableModel dtm){
for(int i=0;i<dtm.getRowCount();i++){
CmbCodeRegistre.addItem(dtm.getValueAt(i, 0));
}

}

voici la methode FormChoixRegistre1 de FormChoixRegistre1
public DefaultTableModel getDefaultModele(){
return bModel;
}
et si ce n'est pas bon,pouvez s'il vous plait me faire voir votre code si c'etait vous qui devriez le faire?
0
choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 2 101
16 nov. 2011 à 18:28
Voilà où je voulais en venir...

Ne sachant pas ce qui te permet de remplir ton combobox, j'ai pris (par exemple) ton tableau d'Objets "objects" comme argument probable

public final class FormChoixRegistre1 extends javax.swing.JFrame { 
    private FormANaiss1 fan; 
    private int colNo;
    private Object objects[];
    /** Creates new form FormChoixRegistre */
    public FormChoixRegistre1() { /
        this.formNaiss=fan = new formNaiss(objects);
        initComponents();
        setResizable(false);
        setLocationRelativeTo(null);
        listeRegistre();
        TxtNbRegistreDispo.setText(Integer.toString(aModel.getRowCount()));
    }



public final class FormANaiss1 extends javax.swing.JFrame {
    /** Creates new form FormANaiss */
private javax.swing.JComboBox CmbCodeRegistre;
    public FormANaiss1(Object[] objects) {
       
       
        initComponents(objects);
        setSize(807, 645);
        setLocationRelativeTo(null); 
    }
Private void  initComponents(Object[] objects){

// ici le code d'initialisation de la 2 ème frame avec le combobox en utilisant objetcs comme arguments

} 
public void setRegistres(Object reg) {//setter de remplisage du combobox
        this.CmbCodeRegistre.addItem(reg);
    }
}
0
coolanso Messages postés 75 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 5 juillet 2014
17 nov. 2011 à 13:26
Salut choubaka,j'ai suivi tes instructions,mais je crois que quelque chose cloche toujours.
Pour repondre à ta question,c'est le model (bModel)de la table(txtJtableRegCharger) de la classe (FormChoixRegistre1)que je souhaite passé en parametre afin de remplir le combo de la classe(FormANaiss1). Voici le code du modele :

txtJtableRegCharger = new javax.swing.JTable();
String[] tableColumnsName1 = {"Liste des registres à charger"};
bModel = new DefaultTableModel()
{
public boolean isCellEditable(int row, int col)
{
return false;
}
};
txtJtableRegCharger.getSelectionModel().addListSelectionListener(new RowListener1());
bModel.setColumnIdentifiers(tableColumnsName1);
txtJtableRegCharger.setModel(bModel);

et je rempli ce model par les lignes d'une autre table dont le model est aModel ,lequel ne m'interresse pas ici.
Voici la methode qui me permet de remplir bModel :

private void CmdAjouterActionPerformed(java.awt.event.ActionEvent evt) {
int i=txtJtableRegDispo.getSelectedRow();
Object [] valeur = {txtJtableRegDispo.getValueAt(i, 0)};
txtJtableRegDispo.clearSelection();

if ( isValueValide( valeur ) ){
bModel.addRow(valeur);//Ajout de la ligne dans le model
}
else {JOptionPane.showMessageDialog(null, c+" existe déjà", "Erreur", JOptionPane.ERROR_MESSAGE);
System.out.println("la valeur du doublon est :"+valeur);
}

}
Et voici mon code adapté a tes instructions :

public final class FormChoixRegistre1 extends javax.swing.JFrame {
private FormANaiss1 fan;
private int colNo;
private Object objects[];
private javax.swing.JTable txtJtableRegCharger;
private DefaultTableModel dtm;
private DefaultTableModel aModel,bModel;// aModel et bModel sont des modeles de table

/** Creates new form FormChoixRegistre */
public FormChoixRegistre1() {
fan = new FormANaiss1(bModel); //j'ai passé en parametre le modele de la table
initComponents();
setResizable(false);
setLocationRelativeTo(null);
listeRegistre();
}
}
Je veux qu'au moment de quitter le formulaire FormChoixRegistre1 les données soient balancées à FormANaiss1 :voici mon code :

private void CmdQuitterActionPerformed(java.awt.event.ActionEvent evt) {
final int[] rep = new int[1];
rep[0] = JOptionPane.showConfirmDialog(null, "Voulez-vous vraiment quitter cette fenêtre?", "Quitter", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (rep[0] == JOptionPane.YES_OPTION) //System.exit(6);
{
fan.setRegistres(bModel);//renvoie du model à la methode setRegistres de FormANaiss1

for(int i=0;i<bModel.getRowCount();i++){
fan.setRegistres(bModel.getValueAt(i, colNo));
}
this.setVisible(false);
}

}
le code de FormANaiss1 :

public final class FormANaiss1 extends javax.swing.JFrame {

/** Creates new form FormANaiss */
public FormANaiss1(DefaultTableModel dftm ) {
setSize(807, 645);
setLocationRelativeTo(null);
initComponents();
remplirCombo(dftm);

//setRegistres(frmReg.getDefault());

}

private void remplirCombo(DefaultTableModel dtm){
CmbCodeRegistre=new JComboBox();
}
public void setRegistres(Object reg) {//setter de remplisage du combobox
this.CmbCodeRegistre.addItem(reg);
}
}
voici,je ne sais pourquoi,ma combo reste toujours sans données a l'ouverture.
0
choubaka Messages postés 39395 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 2 juin 2024 2 101
18 nov. 2011 à 07:44
Bonjour

Si je comprends bien, ton deuxième formulaire ne s'ouvre que lorsque tu fermes le premier.

Je placerais alors l'appel au constructeur de la deuxième fenêtre dans la méthode "CmdQuitterActionPerformed" et pas avant.

Le fait que ton combo ne se remplisse pas peut provenir de l'endroit où tu places l'appel à la méthode de remplissage, vérifie la suite logique.

Tu n'as plus de problème de visibilité, apparemment.

0