[java] comment faire en sorte que un Jtextarea

comment faire en sorte que un Jtextarea [java] - Java - Programmation

Marsh Posté le 16-11-2004 à 20:02:13    

re salut deux msg en deux min c bcp mais :
je voudrais savoir comment faire pour q'une JTextArea soit accessible pas n'importe qu'elle classe ?
pour plus de precision:
g un programme qui fait pour l'instant 4 ou 5 classe c peut mais bon....
et dans le programme pricipale ou dans la classe principale g declaré un Jtextarea qui devrai me servir comme indicateur de progression et d'action en cour mais je sais pas comment faire pour qu'il soit accessible par tt les classe surtout que je peut pas utiliser l'heritage,ni les implementation . faut il que je fasse un nouveau package ? declare une fonction d'alteration mais le probleme reste le meme)
 
 

Reply

Marsh Posté le 16-11-2004 à 20:02:13   

Reply

Marsh Posté le 16-11-2004 à 20:11:08    

alors on va commencer par apprendre à écrire et énoncer son problème correctement.
 
tu ne peux pas utiliser l'héritage? pourquoi? et c'est quoi le rapport?

Reply

Marsh Posté le 16-11-2004 à 20:19:46    

je l'utilise deja

Reply

Marsh Posté le 16-11-2004 à 22:35:42    

il faut que tu passes la référence de ton Jtextarea ou de ton objet principal aux autres objets qui en ont besoin (ceux qui veulent modifier le JTextArea).
 
Tu peux par exemple le leur passer au moment où tu les construit (en parmatêtre du constructeur), ou avec une méthode genre setTaClassPrincipale(TaClassPrincipale t). Les objets en question garde une référence de cet objet et quand ils en ont besoin, il l'appelle.
 
Ca s'appelle de l'agrégation ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 16-11-2004 à 22:41:20    

question dans le même style, mais plus poussée : g plusieurs JInternalFrame qui contiennent plein de champs dont je veux récupérer les valeurs (des JTextField et JComboBox principalement), et qui contient aussi un tableau qui interragit avec les champs (si tu sélectionnes une ligne, ca remplit les champs avec les bonnes valeurs)
 
Pour le moment j'ai tous les listener dans chaque classe, mais ca me broute, parce que :  
- les traitements sont les mêmes
- c sale 30.000 innerclasses en fin de classe...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 16-11-2004 à 22:43:28    

benou a écrit :

il faut que tu passes la référence de ton Jtextarea ou de ton objet principal aux autres objets qui en ont besoin (ceux qui veulent modifier le JTextArea).
 
Tu peux par exemple le leur passer au moment où tu les construit (en parmatêtre du constructeur), ou avec une méthode genre setTaClassPrincipale(TaClassPrincipale t). Les objets en question garde une référence de cet objet et quand ils en ont besoin, il l'appelle.
 
Ca s'appelle de l'agrégation ...

euh , ha, c'était ça la question? pfiou, on revient de loin là [:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2004 à 22:44:36    

c ce que j'avais compris aussi


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 16-11-2004 à 22:54:33    

jubijub >> c'est quoi ton probleme? tes listeners? t'est pas obligé d'en faire des inner class hein.. tu peux avoir une classe propre et l'instancier plusieurs fois ...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2004 à 23:01:11    

comment expliquer ca : l'idée c que pour chaque fenetre, je dois pouvoir faire des set et des get sur les valeurs des fields...les gets étant pour activer un constructeur avec les paramètres, et les sets pour réagir au recherches dans le tableau...
 
sinon je sais bien qu'on peut les sortir, mais le pb, si je les sort, c comment récupérer facilement ce que j'ai dans mes fields ?
 
j'ai pensé peut etre en passant une ref sur le JPanel qui les contient...mais après comment récupérer ce qu'il contient dans un ordre fixe ?


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 16-11-2004 à 23:06:45    

dans tous tes panels, c'est les memes infos? si oui, tu dois avoir un model? (ie, un pauvre bean)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2004 à 23:06:45   

Reply

Marsh Posté le 16-11-2004 à 23:46:36    

--> c pas exactement les meme infos non
--> et non g pas de model, je sais pas faire de javabeans


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 16-11-2004 à 23:49:21    

euh

Code :
  1. public class Truc {
  2. private String machin;
  3. public Truc() {
  4. }
  5. public String getTruc() {
  6.   return this.truc;
  7. }
  8. public void setTruc(String truc) {
  9.   this.truc = truc;
  10. }
  11. }


spadur hein [:petrus75]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-11-2004 à 23:55:11    

oui mai sy'a plein de trucs associés que je maitrise pas....ca a des avantages de faire des beans, or je maitrise pas lesquels...pis c pas forcément le sujet... :D ...si j'avais un modèle je ferais des vues dessus, et j'aurai pas de soucis...mais je peux pas faire de modèle...
 
en gros pour etre clair :  
 
g des arbitres, des joueurs, des entraineurs...avec un surtype personne qui encapsule nom,prenom (c tout ce qu'il y a de commun)...
 
au max, y'a 4 attributs : nom, prenom, licence, poste...ca vaudrait le coup de faire un modèle pour ca ?


Message édité par Jubijub le 16-11-2004 à 23:59:06

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 17-11-2004 à 00:18:07    

ben tu l'as ton modele: tes objets Arbitre, Joueur etc...
 
et ce sont probablement des beans ou qqch de proche, que tu n'utilises les bidules que seul nraynaud se risque a utiliser, c'est autre chose...
ce que je voulais te dire c'est que tu pourrais utiliser ceux-ci dans tes events pour recuperer les valeurs modifiées


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-11-2004 à 00:20:18    

tu veux dire passer carrément l'objet Arbitre par ex au listener ? le pb c que le listener marche avec des actionPerformed, dont la signature ne prend que des events...comment refiler l'objet au modèle ? la source de l'event c un jButton, pas l'objet...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 17-11-2004 à 00:20:24    

Jubi > c'est obligatoire de faire un modèle pour ça, parce que sinon, c'est pelle à clou. Et Puis ça t'apprendra à utiliser PropertyChangeSupport et à faire des modèles petits.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-11-2004 à 00:22:54    

PropertyChangeMachin, faudra que j'y jette un oeil un jour, mais ça m'avait fait peur à l'epoque: c'est completement pas typé si je ne m'abuse? genre tu passe un nom arbitraire de propriétés, sous forme d'une String


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-11-2004 à 01:03:06    

oulà ...
 
caramba, malgré mes précautions, il est venu :) ...
 
bon, j'explique proprement le truc, sinon on s'en sortira pas :  
 
J'ai une belle BDD Objet qui stocke tt un bouzin.
 
J'ai une fenetre de ma GUI qui sert à gérer les personnes :  
Elle contient un champs non, prénom, et une combobox (qui permet de choisir le soustype) et un tableau (qui liste le soustype sélectionné, ou tt les personnes selon le choix
 
selon le choix dans la combobox, des champs optionnels apparaissent.
 
Cette GUI sert à plusieurs choses :  

  • création d'un sous type de personne (facile on remplit, je récupère les valeurs, et j'appelle le constructeur qui va bien en testant la valeur de la combobox (qui donne le type de personne)
  • modif d'une personne : on la choisi dans le tableau, ca remplit tt les champs, on modifie et on valide
  • delete : pareil on choisit, on poutre, banco...


à coté de ca je v avoir une fenetre recherche, qui utilise les meme champs, pour rechercher...et donc le même tableau...y'a plein de taches qui seront similaires (à tel point que je me demande encore si ca vaut le coup de séparer la recherche...)...
 
pour l'instant ca marche au poil, c juste que à part le tableModel que g fait propre à coté, tt est dans ma classe GUI, ce que je trouve un poil sale...(ca me fait tjs soucis ca d'avoir 30.000 listenenrs dans la classe, mais j'y coupe jamais parce que je sais pas comment router les événèements ET le contexte au listenenr...
 
en gros, je fous tout en inner, parcce que comme ca pour récupérer la valeur des champs, ben c facile, je suis dans la classe...alors que si je sors le listener, je peux récupérer que la source de l'event, donc g rien à foutre...
 
ma question c y'a-t-il un moyen propre ?
 
ton truc j'ai regardé g pas compris à quoi ca sert...en gros on le fout en membre de la classe qui gère le modèle, et après ?
 
sachant que g une contrainte : la base acceptera peut etre pas de sérialiser mes classes si ce truc est dedans...(c tatillon les bases objets, c surtout bordélique)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 17-11-2004 à 13:09:24    

up


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 19-11-2004 à 19:51:07    

the real moins moins a écrit :

PropertyChangeMachin, faudra que j'y jette un oeil un jour, mais ça m'avait fait peur à l'epoque: c'est completement pas typé si je ne m'abuse? genre tu passe un nom arbitraire de propriétés, sous forme d'une String

c'est le standard javabeans.
edit : et oui, c'est pas typé.
 
un exemple :  

Code :
  1. class Personne {
  2.   public static final String NAME_PROPERTY = "name";
  3.   PorpertyChangeSupport support = new PropertyChangeSupport(this);
  4.   String name;
  5.   public setName(String n) {
  6.     String old;
  7.     name = name;
  8.     support.firePropertyChange(NAME_PROPERTY, old, n);
  9.   }
  10.   public static void addPropertyChangeListener(PropertyChangeListener l) {
  11.     support.add(l);
  12.   }
  13. ...
  14. }


Message édité par nraynaud le 19-11-2004 à 20:00:22

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2004 à 20:03:01    

j'ai regardé mais pas vraiment compris comment on s'en servait...
 
le petit détail de mon truc, c que la plupart des réactions de mon interface sont en réalité des modif de la vue, le modèle change peut, et c bien géré...
 
mais je voudrais sortir de ma GUI les listeners, tout en gardant une possibilité de mettre à jour tt ce qu'elle contient avec ces listeners...sans les mettre en public, ca va de soi [:itm]
 
j'avais pensé à un truc lourdingue, mais qui marcherait
c mettre tt les composant dans une collection quelconque, et passer l'array en paramètre à la construction du listener...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 19-11-2004 à 20:05:45    

tu nous montre ça pendant que j'afute mes clous ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2004 à 20:11:55    

je l'ai pas implémenté, j'y ai juste réfléchi
 
je v poster un screen ce sera plus simple
 

Code :
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.util.ArrayList;
  9. import java.util.Vector;
  10. import javax.swing.BorderFactory;
  11. import javax.swing.JButton;
  12. import javax.swing.JComboBox;
  13. import javax.swing.JDesktopPane;
  14. import javax.swing.JInternalFrame;
  15. import javax.swing.JLabel;
  16. import javax.swing.JPanel;
  17. import javax.swing.JScrollPane;
  18. import javax.swing.JTable;
  19. import javax.swing.JTextField;
  20. import javax.swing.ListSelectionModel;
  21. import javax.swing.Renderer;
  22. import javax.swing.border.Border;
  23. import javax.swing.border.EtchedBorder;
  24. import javax.swing.event.ListSelectionEvent;
  25. import javax.swing.event.ListSelectionListener;
  26. import javax.swing.table.TableCellRenderer;
  27. public class GUIGestionPersonne extends JInternalFrame {
  28.     BASEUtils bu = BASEUtils.getBaseUtils();
  29.    
  30.     JPanel contentPane;
  31.     JPanel base;
  32.     JPanel avance;
  33.     JPanel listePanel;
  34.     JPanel legendePanel;
  35.     JLabel poste;
  36.     JLabel licence;
  37.     JTextField vLicence;
  38.     JTextField vNom;
  39.     JTextField vPrenom;
  40.     JComboBox vCategorie;
  41.     JComboBox vPoste;
  42.     JButton creer;
  43.     JButton modifier;
  44.     JButton supprimer;
  45.    
  46.     JTable tableau;
  47.     public GUIGestionPersonne(JDesktopPane desktop) {
  48.         super("Gestion des personnes", false, true, false, true);
  49.         makeWindow(0);
  50.         desktop.add(this);
  51.     }
  52.     private void makeWindow(int index) {
  53.         // création des panels conteneurs
  54.         contentPane = new JPanel(new GridBagLayout());
  55.         GridBagConstraints c = new GridBagConstraints();
  56.         base = new JPanel(new GridBagLayout());
  57.         GridBagConstraints cBase = new GridBagConstraints();
  58.         avance = new JPanel(new GridBagLayout());
  59.         listePanel = new JPanel(new GridBagLayout());
  60.         GridBagConstraints cliste = new GridBagConstraints();
  61.         legendePanel = new JPanel(new GridBagLayout());
  62.         GridBagConstraints cLegende = new GridBagConstraints();
  63.         // ActionListeners
  64.         ValiderButtonListener buttonListener = new ValiderButtonListener();
  65.         ComboListener comboListener = new ComboListener();
  66.         // bordures
  67.         Border infoBase = BorderFactory.createTitledBorder(BorderFactory
  68.                 .createEtchedBorder(EtchedBorder.LOWERED),
  69.                 "Informations de base" );
  70.         Border infoAvancees = BorderFactory.createTitledBorder(BorderFactory
  71.                 .createEtchedBorder(EtchedBorder.LOWERED),
  72.                 "Informations avancées" );
  73.         Border liste = BorderFactory.createTitledBorder(BorderFactory
  74.                 .createEtchedBorder(EtchedBorder.LOWERED), "Liste" );
  75.         Border bordureLegende = BorderFactory.createTitledBorder(BorderFactory
  76.                 .createLineBorder(Color.BLACK), "Légende" );
  77.         Border bordure = BorderFactory.createEmptyBorder(20, 20, 20, 20);
  78.         // Labels
  79.         JLabel nom = new JLabel("Nom" );
  80.         nom.setBackground(Color.ORANGE);
  81.         nom.setOpaque(true);
  82.         JLabel prenom = new JLabel("Prenom" );
  83.         prenom.setBackground(Color.ORANGE);
  84.         prenom.setOpaque(true);
  85.         JLabel categorie = new JLabel("Catégorie" );
  86.         categorie.setBackground(Color.ORANGE);
  87.         categorie.setOpaque(true);
  88.         licence = new JLabel("Licence" );
  89.         licence.setBackground(Color.ORANGE);
  90.         licence.setOpaque(true);
  91.         poste = new JLabel("Poste" );
  92.         poste.setBackground(Color.ORANGE);
  93.         poste.setOpaque(true);
  94.         JLabel legende = new JLabel("Legende" );
  95.         JLabel arbitre = new JLabel("Arbitre" );
  96.         JLabel entraineur = new JLabel("Entaineur" );
  97.         JLabel joueur = new JLabel("Joueur" );
  98.         // combo boxes
  99.         vCategorie = new JComboBox(Personne.typePersonne);
  100.         vCategorie.setSelectedIndex(index);
  101.         vCategorie.addActionListener(comboListener);
  102.         vPoste = new JComboBox(Joueur.postes);
  103.         // textFields
  104.         vNom = new JTextField();
  105.         vPrenom = new JTextField();
  106.         vLicence = new JTextField();
  107.         // boutons
  108.         JButton creer = new JButton("Créer" );
  109.         creer.addActionListener(buttonListener);
  110.         JButton modifier = new JButton("Modifier" );
  111.         modifier.addActionListener(buttonListener);
  112.         JButton supprimer = new JButton("Supprimer" );
  113.         supprimer.addActionListener(buttonListener);
  114.         // tableau
  115.         ArrayList datum = bu.getPersonneData("Personne" );
  116.         PersonneDataModel model = new PersonneDataModel(datum);
  117.         tableau = new JTable(model);
  118.         tableau.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  119.         ListSelectionModel rowSM = tableau.getSelectionModel();
  120.         rowSM.addListSelectionListener(new ListSelectionListener() {
  121.             public void valueChanged(ListSelectionEvent e) {
  122.                 //Ignore extra messages.
  123.                 if (e.getValueIsAdjusting()) return;
  124.                 ListSelectionModel lsm =
  125.                     (ListSelectionModel)e.getSource();
  126.                 if (lsm.isSelectionEmpty()) {
  127.                
  128.                 } else {
  129.                     int selectedRow = lsm.getMinSelectionIndex();
  130.                     System.out.println(tableau.getSelectedRow());
  131.                     vNom.setText(tableau.getModel().getValueAt(selectedRow,1).toString());
  132.                 }
  133.             }
  134.         });
  135.         /***********************************************************************
  136.          * Mise en page
  137.          */
  138.         //panel général
  139.         contentPane.setBorder(bordure);
  140.         c.gridx = 0;
  141.         c.gridy = 0;
  142.         c.weightx = 1;
  143.         c.weighty = 1;
  144.         c.gridwidth = 3;
  145.         c.fill = GridBagConstraints.HORIZONTAL;
  146.         //panel infos de bases
  147.         cBase.gridx = 0;
  148.         cBase.gridy = 0;
  149.         cBase.weightx = 1;
  150.         cBase.weighty = 1;
  151.         //cBase.ipadx = 50;
  152.         cBase.fill = GridBagConstraints.HORIZONTAL;
  153.         cBase.anchor = GridBagConstraints.LINE_START;
  154.         base.add(nom, cBase);
  155.         cBase.gridx = 1;
  156.         //cBase.ipadx = 200;
  157.         base.add(vNom, cBase);
  158.         cBase.gridx = 0;
  159.         cBase.gridy = 1;
  160.         //cBase.ipadx = 50;
  161.         base.add(prenom, cBase);
  162.         cBase.gridx = 1;
  163.         //cBase.ipadx = 200;
  164.         base.add(vPrenom, cBase);
  165.         base.setBorder(infoBase);
  166.         contentPane.add(base, c);
  167.         //panel général
  168.         c.gridy = 1;
  169.         // panel infos avancées
  170.         cBase.gridx = 0;
  171.         cBase.gridy = 2;
  172.         //cAvance.ipadx = 50;
  173.         //cBase.fill = GridBagConstraints.HORIZONTAL;
  174.         avance.add(categorie, cBase);
  175.         cBase.gridx = 1;
  176.         //cAvance.ipadx = 100;
  177.         //vCategorie.setPreferredSize(new Dimension(10,20));
  178.         avance.add(vCategorie, cBase);
  179.         cBase.gridx = 0;
  180.         cBase.gridy = 3;
  181.         //cAvance.ipadx = 50;
  182.         licence.setVisible(false);
  183.         avance.add(licence, cBase);
  184.         cBase.gridx = 1;
  185.          //cAvance.ipadx = 200;
  186.         vLicence.setVisible(false);
  187.         avance.add(vLicence, cBase);
  188.         cBase.gridy = 4;
  189.         cBase.gridx = 0;
  190.         // cAvance.ipadx = 50;
  191.         poste.setVisible(false);
  192.         avance.add(poste, cBase);
  193.         cBase.gridx = 1;
  194.         //cBase.ipadx = 200;
  195.         vPoste.setVisible(false);
  196.         avance.add(vPoste, cBase);
  197.         avance.setBorder(infoAvancees);
  198.         contentPane.add(avance, c);
  199.         //      panel général, ajout des boutons
  200.         c.gridy = 2;
  201.         c.gridwidth = 1;
  202.         c.insets = new Insets(10,2,10,2);
  203.        
  204.         contentPane.add(creer,c);
  205.        
  206.         c.gridx = 1;
  207.         contentPane.add(modifier,c);
  208.        
  209.         c.gridx = 2;
  210.         contentPane.add(supprimer,c);
  211.        
  212.         //      panel général
  213.         c.gridy = 3;
  214.         c.gridx = 0;
  215.         c.gridwidth = 3;
  216.         c.insets = new Insets(0,0,0,0);
  217.         // panel liste
  218.         cliste.gridx = 0;
  219.         cliste.gridy = 0;
  220.         cliste.weightx = 1;
  221.         cliste.weighty = 1;
  222.         //cliste.ipadx = 50;
  223.         cliste.fill = GridBagConstraints.HORIZONTAL;
  224.         cliste.gridwidth = 3;
  225.         listePanel.add(legende, cliste);
  226.         cliste.gridy = 1;
  227.         cliste.gridwidth = 1;
  228.         listePanel.add(arbitre, cliste);
  229.         cliste.gridx = 1;
  230.         listePanel.add(entraineur, cliste);
  231.         cliste.gridx = 2;
  232.         listePanel.add(joueur, cliste);
  233.         cliste.gridy = 2;
  234.         cliste.gridx = 0;
  235.         cliste.gridwidth = 3;
  236.         listePanel.add(tableau, cliste);
  237.         listePanel.setBorder(liste);
  238.         JScrollPane jsp = new JScrollPane(tableau);
  239.         contentPane.add(jsp, c);
  240.         this.setContentPane(contentPane);
  241.         this.pack();
  242.         this.setVisible(true);
  243.     }
  244.     class ValiderButtonListener implements ActionListener {
  245.         public void actionPerformed(ActionEvent e) {
  246.             // tests permettant de ne créer qu'un seul listener, étant donné le
  247.             // peu d'actions à faire
  248.             if (((JButton) e.getSource()).getText().equalsIgnoreCase(
  249.                     "Créer" )) {
  250.                 ArrayList tmp = new ArrayList();
  251.                 ArrayList first = new ArrayList();
  252.                 first.add("Test1" );
  253.                 first.add("Test2" );
  254.                 first.add("Test3" );
  255.                 first.add("Test4" );
  256.                 first.add("Test5" );
  257.                 tmp.add(first);
  258.                 PersonneDataModel model2 = new PersonneDataModel(tmp);
  259.                 //tableau.setModel(model2);
  260.                 ((PersonneDataModel)tableau.getModel()).setData(tmp);
  261.             } else if (((JButton) e.getSource()).getText().equalsIgnoreCase(
  262.             "Modifier" )) {
  263.                
  264.             } else if (((JButton) e.getSource()).getText().equalsIgnoreCase(
  265.             "Créer" )) {
  266.                
  267.             }
  268.         }
  269.     }
  270.     class ComboListener implements ActionListener {
  271.         public void actionPerformed(ActionEvent e) {
  272.             int i = ((JComboBox) e.getSource()).getSelectedIndex();
  273.             switch (i) {
  274.             case 0:
  275.                 poste.setVisible(false);
  276.                 vPoste.setVisible(false);
  277.                 licence.setVisible(false);
  278.                 vLicence.setVisible(false);
  279.                 break;
  280.             case 1:
  281.                 poste.setVisible(false);
  282.                 vPoste.setVisible(false);
  283.                 licence.setVisible(true);
  284.                 vLicence.setVisible(true);
  285.                 break;
  286.             case 2:
  287.                 poste.setVisible(false);
  288.                 vPoste.setVisible(false);
  289.                 licence.setVisible(false);
  290.                 vLicence.setVisible(false);
  291.                 break;
  292.             case 3:
  293.                 poste.setVisible(true);
  294.                 vPoste.setVisible(true);
  295.                 licence.setVisible(true);
  296.                 vLicence.setVisible(true);
  297.                 break;
  298.             }
  299.             pack();
  300.         }
  301.     }
  302. }



Message édité par Jubijub le 19-11-2004 à 20:13:41

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 19-11-2004 à 20:13:46    

http://jubijub.free.fr/images/gui.png
 
PS : g un pb d'alignement, je sais pas pkoi ...(cf la barre rouge)


Message édité par Jubijub le 19-11-2004 à 20:13:57

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 19-11-2004 à 20:48:58    

Jubi > je pense qu'il faut tronçonner.
 
Tu fais une classe qui représente la liste.
 
Concernant tes boutons, regarde la classe Action, elle correspond à ton besoin.
 
Pour la comboBox, le switch-case c'est pelle à clous, c'est aux objets qui sont dedans d'avoir un comportement, et c'est la modification du modèle qui doit modifier la vue, pas le contrôleur. On modifie pas la vue soi-même. Et il est hors de question que le comportement du truc dépende de l'ordre d'une liste qui a été instanciée potentiellement à 30km.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2004 à 20:59:25    

là g une contrainte : la BDD derrière...
 
en gros ca marche comme ca POET (enfin Versant FastObjects) :  
 
Pour toute action sur la base, faut etre dans une transaction...bon ok.donc si par ex tu fait un select all arbitre (c pas la syntaxe mais bon), ca va te cracher une classe qui est un genre de collection (BagOfObject, c du ODMG)...tout va bien...mais qd tu fermes la transaction, Poet vire les références aux objets : en gros tu peux trimbaler le pointer, mais tt action sur ton objet plante...si tu veux réagir dessus, il faut redemander une transaction, et ensuite les réveiller avec une commande spéciale.
Petit pb : le fait d'etre dans une transaction fait ramer la GUI, or, je suis obligé d'etre dans une transaction pour récupérer, c mort...
 
Workaround : je récupère ma liste d'objet, et de suite, je me crée un tableau de String...l'intéret de cette technique c que ca crée des String (sic), et donc ca me vire les pointeurs moisis....
 
donc ensuite dans ma GUI je bosse avec que des string...et dès qu'un utilisateur veut faire un truc...je récupère les string qui correspondent aux identifiants, je récupère tt les objets dans une transaction, je fais les OP, et je referme la transaction...
 
c lourdingue, mais c une contrainte que j'ai que je peux pas contourner...c pas vraiment optimisé pour faire une GUI dynamique sur les objets...parce que pour des raisons liés à une base, Poet désactive les pointeurs pour etre sur que tu n'aie pas un objet "périmé"...
 
donc vu que ce sont des String, ben je peux rien faire...
 
Sinon pour les 2 listes (les postes et les types de personnes), ce sont des constantes final...donc l'ordre changera pas...
 
Les actions je connais...mais g tjs le meme pb : en ultra résumé : comment mettre à jour des composants de la GUI hors de la GUI ? les textField et tout ca, y ont pas de modèle que je puisse taper de dehors ?


Message édité par Jubijub le 19-11-2004 à 21:00:40

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 19-11-2004 à 21:10:39    

tu as plusieurs solutions, la première, c'est de faire des snapshots de tes données active. Une autre, c'est de faire des "transactoins longues", qui consiste à garder les transactions dans la gui (à coups de "select for update" ).
 
Les logiciels classiques font simplement un snapshot (surtout en client/serveur). En gros, au lieu de travailler sur le domaine, tu travailles sur un proxy/cache de l'objet. et tu devra faire explicitement l'update en fin d'édition.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2004 à 21:14:42    

jubi > de toutes façons, dans une certaine mesure, tu peux taper une sousclasse de DefaultDocument de dehors.
 
Sinon, toujours pareil, pour dialoguer entre 2 taches, c'est file de messages ou locking de l'objet.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2004 à 22:23:12    

--> si je garde les transactions dans la GUI, elle freeze (g testé)
 
--> les snapshot, ca implique de garder une copie de l'objet, c bien ca ? Je fais comment pour faire ca ? je me fous clonable sur mes modèles ?
 
sinon je comprends pas ce que tu veux que je fasse...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 20-11-2004 à 11:56:47    

jubi > tu fais 2 classes par entité, une classe qui ne fait que stocker les valeurs et que tu fileras à la base objet pour qu'elle joue. Une vraie classe qui représente l'entité, avec un comportement etc. qui sera réellement utilisée. Cette deuxième classe aura des points dans ses méthodes où elle sauvera son état dans la classe de sauvegarde correspondante.
 
Bref, tu fais un conteneur d'EJB maison et tu comprends pourquoi les BDD objet sont un échec, ça ne t'apporte rien de plus qu'une BDD relationelle dans ton dev.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-11-2004 à 14:36:18    

donc si j'ai suivi, qd je récupère l'objet, je choppse tt ses valeurs, et j'instancie un nouveau truc avec...c ca ?
 
l'idée à l'air bien, mais g très peur que ma prof trouve ca nul, pour la raison suivante : l'(intéret du méchanisme de Poet, c que tu récupères les objets pour bosser cash dessus...dans le fond, ca revient à les dupliquer...
 
donc si g tjs bien compris, sans passer par un modèle, j'ai aucun moyen de faire ce que je veux...à savoir modifier une GUI hors de la GUI...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 20-11-2004 à 14:46:01    

Jubijub a écrit :


l'idée à l'air bien, mais g très peur que ma prof trouve ca nul, pour la raison suivante : l'(intéret du méchanisme de Poet, c que tu récupères les objets pour bosser cash dessus...

bah oui, mais si il se dit que les bases de données Objet sont un échec complet, il y a une raison, tout le monde aimerait que ça fonctionne. Donc soit tu fais ton truc (qui rame donc) dans la transaction, comme ta prof le voudrait, soit tu copies tes données (ce que tu fais actuellement, mais comme un porc) mais dans tous les cas, ben c'est pas de ta faute, tu es avec du matos vicié, il faut gérer la crise. Il est courant de copier ses données dans le tiers de présentation, ça se fait en web, ça se fait en client-serveur.
 
L'avantage de copier, c'est que tu peux virer la BDD Objet qui est derrière et changer le backend de persistance, par contre, gérer les transactions à la main, c'est la galère (et je te déconseille de t'y lancer, c'est complexe et si tu les veux, bah tu fais comme la prof te dit, avec un truc qui rame). Mais tu retrouves le même problème en web, tu peux te faire piquer le dernier article du stock pendant que tu fais ton paiement en ligne.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-11-2004 à 15:17:50    

En fait ma prof fait aussi partie du centre de recherche (comme tt l'équipe de mon DESS en fait), et à ce titre elle a déployé POET C++ chez FT...et visiblement ils en étaient super content...donc l'argument : mais c nul madame passera difficilement...:D ...c vrai que dans l'idée c bien, parce que tu choppes l'objet et ses méthodes...et qu'en relationnel t forcé de reprendre les données que tu sors pour réinstancier le truc...mais c vrai aussi que c trop contraignant à utiliser
 
c un dilème que tu me poses là...d'un autre coté g pas forcément le temps de me rechanger tt l'appli (et mon binome va hurler :D) ...d'un autre je sais que c sale...et lent ...d'un autre coté je saurais meme pas quelle règles appliquer pour resynchroniser les infos (par ex tu choppes un objet, tu change le nom de paul vers jacques, et tu resynchronises, et là pan, un autre avait eu l'idée de changer de paul vers pierre...qui a raison ? vu que l'objet est dans la base, je peux pas gérer le lock moi même


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 20-11-2004 à 15:27:38    

Jubijub a écrit :

je saurais meme pas quelle règles appliquer pour resynchroniser les infos (par ex tu choppes un objet, tu change le nom de paul vers jacques, et tu resynchronises, et là pan, un autre avait eu l'idée de changer de paul vers pierre...qui a raison ? vu que l'objet est dans la base, je peux pas gérer le lock moi même

tu est en concurrence en plus ?
La règle est la même qu'en EJB, tu es exactement dans le besoin de ce truc.
 
mais si vraiment la prof est à fond dedans, alors fait des transactions longues, en utilisant des "select for update", c'est le truc "pur" (et accessoirement le plus facile à faire).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-11-2004 à 15:58:36    

non je suis pas en concurrence....
 
mais tes transactions longues...elles freezent la gui...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-11-2004 à 23:51:41    

t'aurai pu viré emule quand meme [:petrus75]

Reply

Marsh Posté le 24-11-2004 à 23:58:35    

ben quoi, je télécharges des iso linux [:petrus75]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed