IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Passer variables d'une JTable à une autre sur un Joptionpane


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut Passer variables d'une JTable à une autre sur un Joptionpane
    Bonjour à tous.

    Je travaille sur un panel de caisse qui avance petit à petit. Un scan de code barre provoque une recherche et l'affichage du produit cible, qui est ensuite ajouté à la JTable simulant le panier. J'en suis à l'étape de validation du panier : c'est à dire un bouton déclenche l'ouverture d'un Joptionpane reprenant le panier actuel, invitant l'utilisateur à imprimer une facture, revenir en arrière ou valider et donc envoyer le contenu du panier en base. Là ou je suis perdu c'est que je ne sais pas quelle méthode est la plus adaptée pour passer les données de la JTable du panier vers la JTable du formulaire, qui partagent le même modèle.

    Bien cordialement

    L'extrait de mon panel de caisse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    		tableaupan.setTableHeader(null);
    		tableaupan.getColumnModel().getColumn(0).setPreferredWidth(5);
    		tableaupan.getColumnModel().getColumn(1).setPreferredWidth(5);
    		tableaupan.getColumnModel().getColumn(2).setPreferredWidth(220);
    		tableaupan.getColumnModel().getColumn(3).setPreferredWidth(40);
    		JScrollPane scroll = new JScrollPane(tableaupan);
    		scroll.getViewport().setBackground(Color.WHITE);
    		pangauche.add(scroll, mpan); 
     
    		jButton2 = new JButton("Supprimer");
    		mpan.gridwidth = 1;
    		mpan.gridx = 0;
    		mpan.gridy = 2;
    		pangauche.add(jButton2, mpan);
     
    		jButton3 = new JButton("Valider l'achat");
    		mpan.gridwidth = 1;
    		mpan.gridx = 1;
    		mpan.gridy = 2;
    		pangauche.add(jButton3, mpan);
     
    		jButton3.addActionListener(new ActionListener(){
    	        public void actionPerformed(ActionEvent arg0) {
    	        	Formvalidcaisse zd = new Formvalidcaisse(null, "Valider la transaction", true);
    	        	Formvalidcaisseinfo zInfo = zd.showFormcom(); 
    		        JOptionPane jop = new JOptionPane();
    		        jop.showMessageDialog(null, zInfo.toString(), "Finaliser transaction", JOptionPane.INFORMATION_MESSAGE);
    	        }
     
    	      });
     
                           //---Bouton pour éliminer les lignes
    			jButton2.addActionListener(new java.awt.event.ActionListener() {
    			    @Override
    			    public void actionPerformed(java.awt.event.ActionEvent evt) {
    			    	    int[] selection = tableaupan.getSelectedRows();
    			    	    for(int j = selection.length - 1; j >= 0; j--){
    			    	   	modele.removeCaisse(selection[j]);
    			    	 }
    			    }
    			    });	    
    			//------------- --------------------------------------------------  
     
    		    //---Bouton qui déclenche l'ajout du produit dans le panier----------
    			jButton1.addActionListener(new java.awt.event.ActionListener() {
    			    @Override
    			    public void actionPerformed(java.awt.event.ActionEvent evt) {
    			    	//---Si le JTextfield contenant le titre produit n'est pas vide alors l'ajoute est possible----------
    			    	if(JTitre.getText().length()!=0)
    			    	{	
    			    	mont = (mont + prixtotal);
    			    	JMontant.setText((df.format(mont))+" €");
    			    	JTTicket.setText((df.format(mont)));
    			    	System.out.println(df.format(mont));
    			    	modele.addCaisse(new Caisse(idprod,cqte, JTitre.getText().toString(),prixtotal));
    			    	}
    			    	else
    			    	{
    			    		   JOptionPane.showMessageDialog(null, "Il n'y a rien à ajouer au panier !", "Erreur d'ajout au panier",
                                       JOptionPane.ERROR_MESSAGE);
    			    	}
    			    	//    int[] selection = tableaupan.getSelectedRows();
    			    	 //   for(int j = selection.length - 1; j >= 0; j--){
    			    	 //  	modele.removeCaisse(selection[j]);
    			    	 //}
    			    }
     
    			    });	  
    	 }
    }
    Le formulaire de validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    package com.pl.app;
     
    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
     
    public class Formvalidcaisse extends JDialog {
     
      private boolean sendData;
      private Formvalidcaisseinfo zInfo = new Formvalidcaisseinfo();
      private CaisseTableModel modele = new CaisseTableModel();
      private JButton JButton1,JButton2;
      private JTable tableaupan;
     
      public Formvalidcaisse(JFrame parent, String title, boolean modal){
        super(parent, title, modal);
        this.setSize(750, 500);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        this.initComponent();
      }
     
      public Formvalidcaisseinfo showFormcom(){
        this.sendData = false;
        this.setVisible(true);      
        return this.zInfo;      
      }
     
     
      private void initComponent(){
    	  this.setLayout(new GridBagLayout());
    		GridBagConstraints c = new GridBagConstraints();
     
    		c.gridx = 0;
    		c.gridy = 0;
    		c.gridwidth = 3;
    		tableaupan = new JTable(modele);
    		tableaupan.setBackground(Color.white);
    		tableaupan.setTableHeader(null);
    		tableaupan.getColumnModel().getColumn(0).setPreferredWidth(5);
    		tableaupan.getColumnModel().getColumn(1).setPreferredWidth(5);
    		tableaupan.getColumnModel().getColumn(2).setPreferredWidth(220);
    		tableaupan.getColumnModel().getColumn(3).setPreferredWidth(40);
    		JScrollPane scroll = new JScrollPane(tableaupan);
    		scroll.getViewport().setBackground(Color.WHITE);
    		this.add(scroll, c); 
     
    		JButton FactureButton = new JButton("Facture");
    		c.gridx = 0;
    		c.gridy = 1;
    		c.gridwidth = 1;
    		this.add(FactureButton, c);
     
    		JButton okButton = new JButton("Valider la transaction");
    		c.gridx = 2;
    		c.gridy = 1;
    		c.gridwidth = 1;
    		this.add(okButton, c);
     
    		okButton.addActionListener(new ActionListener(){
    	        public void actionPerformed(ActionEvent arg0) {        
    	          setVisible(false);
    	        }
    	      });
     
    		JButton cancelButton = new JButton("Retour");
    		c.gridx = 1;
    		c.gridy = 1;
    		c.gridwidth = 1;
    		this.add(cancelButton, c);
     
    		cancelButton.addActionListener(new ActionListener(){
    	        public void actionPerformed(ActionEvent arg0) {
    	          setVisible(false);
    	        }   
    	    });
      }
     
    }
    Ma classe de données du panier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package com.pl.app;
     
    //Cette classe permet de préparer les objets qui vont recevoir les informations du panier
     
    public class Caisse {
    	private int idprodp = 0;
    	private int quantp = 0;
        private String titrep;
        private float prixp = 0;
     
        public Caisse(int idprodp, int quantp,String titrep, float prixp) {
            super();
            this.idprodp = idprodp;
            this.quantp = quantp;
            this.titrep = titrep;
            this.prixp = prixp;
        }
     
        public int getidprodp() {
            return idprodp;
          }
     
        public void setidprodp(int idprodp) {
            this.idprodp = idprodp;
          }
     
        public int getquantp() {
            return quantp;
          }
     
        public void setquantp(int quantp) {
            this.quantp = quantp;
          }
     
        public String getTitrep() {
            return titrep;
        }
     
        public void setTitrep(String titrep) {
            this.titrep = titrep;
        }
     
        public float getprixp() {
            return prixp;
          }
     
        public void setprixp(float prixp) {
            this.prixp = prixp;
          }
     
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    Je me permet de faire un up de mon message, car je ne trouve pas de solutions.

    Sur le tuto de baptiste-wicht dont je me suis inspiré, la méthode d'ajout de ligne ne m'aide pas trop à comprendre, puisqu'il utilise un valeur codée en dur. J'aimerai comprendre comment ajouter une plage de données qui pourrait être utilisée à partir d'une autre classe (en l'occurence un Joptionpane ici), mais avec le même modèle (CaisseTableModel).

    Merci !

    Mon TableModel de Caisse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    package com.pl.app;
    import java.util.List;
    import java.util.ArrayList;
     
    import javax.swing.table.AbstractTableModel;
     
    public class CaisseTableModel extends AbstractTableModel
    {
    private final List<Caisse> caisse = new ArrayList<Caisse>();	
    private final String[] entetes = {"idprodp","quantp","titrep","prixp"};
     
     
    public CaisseTableModel() {
        super();  
     
    }
     
    public int getRowCount() {
        return caisse.size();
    }
     
    public int getColumnCount() {
        return entetes.length;
    }
     
    public String getColumnName(int columnIndex) {
        return entetes[columnIndex];
    }
     
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch(columnIndex){
            case 0:
                return caisse.get(rowIndex).getidprodp();
            case 1:
                return caisse.get(rowIndex).getquantp();
            case 2:
                return caisse.get(rowIndex).getTitrep();
            case 3:
                return caisse.get(rowIndex).getprixp();
            default:
                return null; //Ne devrait jamais arriver
        }
    }
     
    public void addCaisse(Caisse cai) {
    	caisse.add(cai);
        fireTableRowsInserted(caisse.size() -1, caisse.size() -1);
    }
     
    public void removeCaisse(int rowIndex) {
    	caisse.remove(rowIndex);
        fireTableRowsDeleted(rowIndex, rowIndex);
    }
     
     
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je ne comprends pas la question : tu voudrais

    1. partager la même instance du modèle entre tes deux jtables : donc les mêmes données, avec les modifications faites d'un côté sont répercutés/visible dans l'autre ?
    2. copier les données du modèle de la première dans un nouveau modèle et utiliser ce dernier dans la seconde jtable ?
    3. utiliser simplement la même classe de modèle ( CaisseTableModel ) dans les deux jtables, avec des données complètements différentes ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    Oui c'est exactement le cas 1/ . Ayant utilisé un modele et une classe de données, je pense que cela doit être faisable, mais c'est justement l'appel de ces données qui m'échappe.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Deux JTables peuvent effectivement partager la même instance de modèle. Pour pouvoir utiliser la même instance dans 2 classes différentes, il suffit de pourvoir avoir accès dans les deux classes à la référence de cette instance. En gros, il faut que, des deux classes, on puisse avoir accès directement à une variable, ou indirectement à cette variable, via une méthode d'une autre classe. Il y a plusieurs façons de gérer la chose, en fonction de la structure de ton programme, et de qui est responsable de créer l'instance de modèle, et de qui est responsable de créer les instances des deux classes qui utilisent le modèle (c'est-à-dire les deux classes qui créent chaque JTable). Il peut être nécessaire de déplacer le code de création du modèle pour pouvoir faciliter l'accès.

    Par exemple, on peut avoir de base, dans l'hypothèse où les deux JTable sont créées dans la même méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TableModel model = ...;
     
    JTable table1 = new JTable(model);
    JTable table2 = new JTable(model);
    Si tu as une classe, mettons une JFrame, qui créé un JPanel, puis créé le TableModel, puis créé la première JTable, tout ceci dans une méthode (ou le constructeur) et qui a un bouton, qui créé la second JTable et affiche le JOptionPane via un actionListener, donc forcément dans une autre méthode qui a créé la première JTable, il suffit que la variable qui "pointe" sur l'instance de modèle soit accessible depuis la méthode qui créé la première JTable, et depuis la méthode qui créé la seconde. Par exemple, il suffit que la variable soit une variable membre de la classe de JFrame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class MyFrame extends JFrame {
     
        private TableModel model;
     
        public MyFrame() {
     
            model = ...;
     
            JTable table1 = new JTable(model);
     
            ...
     
            JButton button = new JButton(...);
            button.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent event) {
     
                         JTable table2 = new JTable(model); // la variable model est membre de MyFrame et est donc visible depuis la méthode de cette classe anonyme locale
     
                         JOptionPane.showConfirmDialog(null, table2); // je simplifie ici, parce que c'est un peu plus sioux de mettre une JTable dans un JOptionPane (JScrollPane, layout, preferedSize, etc... d'ailleurs un JDialog modal serait bien plus simple pour gérer ça)
     
     
                   }
            }
     
        }
     
     
    }
    Ensuite, on peut étendre le principe, en passant cette variable en paramètre : par exemple, imaginons que tu fasses une classe MyDialog extends JDialog pour faire l'édition de table2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     button.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent event) {
     
                         MyDialog dialog = new MyDialog(model); // on passe le modèle en paramètre du constructeur
                         dialog.setvisible(true);
     
     
                   }
            }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public class MyDialog extends JDialog {
     
         public MyDialog(TableModel model) {
     
              ...
              JTable table2 = new JTable(model);
              ...
     
         }
     
    }
    On peut également créer le modèle dans un classe à part, qui a la possibilité de transmettre cette instance, à la frame d'un côté (par un paramètre de son constructeur) et le dialog de l'autre...

    Dans ton cas, il y a également la solution de déclarer le modèle final, puisque à ce que je vois tu crées ta table et le bouton qui affiche le JOptionPane dans la même méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class MyFrame extends JFrame {
     
        public MyFrame() {
     
            final TableModel model = ...;
     
            JTable table1 = new JTable(model);
     
            ...
     
            JButton button = new JButton(...);
            button.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent event) {
     
                         JTable table2 = new JTable(model); // la variable model est final donc accessible dans cette méthode d'une classe locale à la méthode qui déclare la variable model
     
                         JOptionPane.showConfirmDialog(null, table2); // je simplifie ici, parce que c'est un peu plus sioux de mettre une JTable dans un JOptionPane (JScrollPane, layout, preferedSize, etc... d'ailleurs un JDialog modal serait bien plus simple pour gérer ça)
     
     
                   }
            }
     
        }
     
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/01/2013, 10h40
  2. [Lazarus] [0.9.30.4] Passer avec Alt+Tab d'une form à une autre du même projet
    Par CortelliStefano dans le forum Lazarus
    Réponses: 0
    Dernier message: 14/04/2012, 12h27
  3. Passer l'objet connection d'une page à une autre
    Par libuma dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2008, 12h44
  4. Réponses: 1
    Dernier message: 06/11/2007, 02h48
  5. Passer un tableau javascript d'une page à une autre
    Par jean-pierre96 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/04/2007, 21h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo