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

Composants Java Discussion :

JTable, tri et récupération des objets du tablemodel


Sujet :

Composants Java

  1. #1
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut JTable, tri et récupération des objets du tablemodel
    Bonjour,

    J'ai une liste de MyObject que je veux mettre dans un tableau, chaque colonne du tableau correspondant à une propriété de chaque instance de MyObject. Sur ce tableau, je veux :
    1. Faire apparaître un menu contextuel sur des lignes pour appliquer des traitements à l'instance de MyObject correspondant
    2. Pouvoir réordonner les lignes suivant une colonne


    Pour régler le 1er point, j'ajoute au niveau du TableModel l'instance de MyObject pour pouvoir la récupérer lors de l'utilisation du menu contextuel
    Pour régler le 2ème point, j'utilise la classe proposée par Sun ici
    Mais ces 2 solutions cohabitent mal:
    • Le fait d'ajouter les instances de MyObject dans le tablemodel fait que le tri ne marche pas. J'ai essayé de modifier la méthode compareTo de la classe Row dans MyTableSorter mais cela impose que cela soit toujours la même propriété de MyObject qui soit présente dans la tablemodel sous forme de MyObject (en utilisant un renderer dans la table) et que les autres soient sous la forme de String (par exemple)
    • Si je mets les valeurs des champs dans le tablemodel, alors je ne peux plus accéder aux instances de MyObject.


    Comment faire pour que les deux points ci-dessus marchent simultanément

    Merci d'avance pour votre aide



    Pour informations, voilà des bouts de code et le détail des classes

    Construction de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MyTableModel tableModel = new MyTableModel ();
    tableModel.fillTable();
    MyTableSorter tableSorter = new MyTableSorter(tableModel );
    MyTable table = new MyTable (tableSorter);
    tableSorter.setTableHeader(table.getTableHeader());
    JScrollPane tableScroll  = new JScrollPane(table);
    classe MyObject
    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
    public class MyObject
    {
    	public MyObject()
    	{
    	}
    	public void setName(String name)
    	{
    		_name = name;
    	}
    	public void setFirstName(String firstName)
    	{
    		_firstName = firstName;
    	}
    	public String getName()
    	{
    		return _name;
    	}
    	public String getFirstName()
    	{
    		return _firstName;
    	}
     
    	private String _name;
    	private String _firstName;
    }
    Classe MyTable
    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
    public class MyTable extends JTable implements MouseListener
    {
        public MyTable(Vector datas, Vector columNames)
        {
            super(datas, columNames);
            addMouseListener(this);
        }
     
        public MyTable(TableModel tableModel)
        {
            super(tableModel);
            addMouseListener(this);
     
            // Rendu de la colonne #1
            DefaultTableCellRenderer c1Renderer = new DefaultTableCellRenderer()
            {
                public void setValue(Object value)
                {
                	MyObject obj = (MyObject)value;
                	String val = obj.getName();
                	setText(val);
                }
      	    };
      	    getColumnModel().getColumn(0).setCellRenderer(c1Renderer);
      	    // Rendu de la colonne #2
            DefaultTableCellRenderer c2Renderer = new DefaultTableCellRenderer()
            {
                public void setValue(Object value)
                {
                	MyObject obj = (MyObject)value;
                	String val = obj.getFirstName();
                	setText(val);
                }
      	    };
      	    getColumnModel().getColumn(1).setCellRenderer(c2Renderer);
        }
     
        // ******************************************
        // MouseListener interface
        // ******************************************    
        public void mouseClicked(MouseEvent e)
        {
            int currentLine = rowAtPoint(e.getPoint());
        	if (e.getButton() == MouseEvent.BUTTON3)
        	{
                if (_popUp == null)
                {
                    _popUp = new JPopupMenu();
                    _menuItemEdit 	= new JMenuItem("Editer");
                    _menuItemEdit.addMouseListener(this);
                    _popUp.add(_menuItemEdit);
                }
                _popUp.show(this, e.getX(), e.getY());
                changeSelection(currentLine, -1, false, false);
        	}
        }
     
        public void mousePressed(MouseEvent e)
        {
            _popUp.setVisible(false);
            // Récupération de l'objet sélectionné
            MyObject obj = (MyObject)getValueAt(getSelectedRow(), 0);
            if (e.getSource() == _menuItemEdit)
            {
                // Edition de obj
            }
        }
        public void mouseEntered(MouseEvent e)
        {
        }
        public void mouseExited(MouseEvent e)
        {
        }
        public void mouseReleased(MouseEvent e)
        {
        }
     
        private JPopupMenu 	_popUp;
        private JMenuItem 	_menuItemEdit;
    }
    Classe MyTableModel
    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
    public class MyTableModel extends DefaultTableModel
    {
        public MyTableModel()
        {
            super();
            addColumn("Nom");
            addColumn("Prénom");
        }
     
        public MyTableModel(Object[] columnNames)
        {
            super(columnNames, 0);
        }
     
        public Class getColumnClass(int c)
        {
            return getValueAt(0, c).getClass();
        }
     
        public void fillTable()
        {
        	removeAllRows();
        	// Réalisation de la requête
        	ArrayList persons = ...;
        	for (int i=0; i <= persons.size(); i++)
        		addRow((MyObject)persons.get(i));
        }
     
        private void addRow(MyObject obj)
        {
            Vector tmp = new Vector();
            tmp.add(obj); // Nom
            tmp.add(obj); // Prénom
            addRow(tmp);
        }  
     
        private void removeAllRows()
        {
            setRowCount(0);
        }
    }
    Classe MyTableSorter : C'est la classe proposée par Sun dans le tutorial mais voici le détail de la méthode compareTo
    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
    public int compareTo(Object o)
    {
      int row1 = modelIndex;
      int row2 = ((Row) o).modelIndex;
     
      for (Iterator it = sortingColumns.iterator(); it.hasNext();)
      {
        Directive directive = (Directive) it.next();
        int column = directive.column;
        Object o1 = tableModel.getValueAt(row1, column);
        Object o2 = tableModel.getValueAt(row2, column);
     
        int comparison = 0;
        if ((o1 instanceof MyObject) && (o2 instanceof MyObject))
        {
          MyObject obj1 = (MyObject)o1,
                        obj2 = (MyObject)o2;
          o1 = new String(obj1.getName());
          o2 = new String(obj1.getName());
          ...
        }
      }
    }

  2. #2
    Membre régulier

    Inscrit en
    Juin 2003
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 158
    Points : 96
    Points
    96
    Par défaut
    Bonsoir,

    Pour ceux que cela pourrait intéresser, voici la solution qui s'articule en 5 points :
    1. Stocker les valeurs dans une ArrayList dans mon TableModel
    2. Implémenter la getValueAt(int,int) sur mon TableModel
    3. Ne plus avoir de renderer dans Table
    4. Récupérer l'indice non pas dans la table mais celle associée au niveau du TableModel en utilisant modelIndex au niveau du TableSorter
    5. Ne rien faire dans TableSorter puisque la méthode getValueAt() renvoie désormais des types simples et que comapteTo fait très bien le travail sur de tels types


    Voici le détail des classes du table
    MyTable
    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
    public class MyTable extends JTable implements MouseListener
    {
        public MyTable(Vector datas, Vector columNames)
        {
            super(datas, columNames);
            addMouseListener(this);
        }
     
        public MyTable(TableModel tableModel)
        {
            super(tableModel);
            _tableSorter = (TableSorter)tableModel;
            _tableModel  = (MyTableModel)(_tableSorter.getTableModel());
            addMouseListener(this);
        }
     
        // ******************************************
        // MouseListener interface
        // ******************************************    
        public void mouseClicked(MouseEvent e)
        {
          int currentLine = rowAtPoint(e.getPoint());
        	if (e.getButton() == MouseEvent.BUTTON3)
        	{
                if (_popUp == null)
                {
                    _popUp = new JPopupMenu();
                    _menuItemEdit 	= new JMenuItem("Editer");
                    _menuItemEdit.addMouseListener(this);
                    _popUp.add(_menuItemEdit);
                }
                _popUp.show(this, e.getX(), e.getY());
                changeSelection(currentLine, -1, false, false);
        	}
        }
     
        public void mousePressed(MouseEvent e)
        {
            _popUp.setVisible(false);
            // Récupération de l'objet sélectionné
            int modelIndex = _tableSorter.modelIndex(getSelectedRow());
            MyObject obj = (MyObject)_tableModel.getValueAt(modelIndex);
            if (e.getSource() == _menuItemEdit)
            {
    	    System.out.println(obj.getName());
            }
        }
        public void mouseEntered(MouseEvent e)
        {
        }
        public void mouseExited(MouseEvent e)
        {
        }
        public void mouseReleased(MouseEvent e)
        {
        }
     
        private JPopupMenu 	 _popUp;
        private JMenuItem 	 _menuItemEdit;
        private TableSorter  _tableSorter;
        private MyTableModel _tableModel;
    }
    MyTableModel
    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
    class MyTableModel extends AbstractTableModel
    {
            private String[] columnNames = {"First Name",
                                            "Last Name"};
     
    	public MyTableModel()
            {
              super();
              MyObject obj1 = new MyObject("Paul","Guirlen"),
                       obj2 = new MyObject("Henri","Derien"),
                       obj3 = new MyObject("Michel","Verin");
              datas.add(obj1);
              datas.add(obj2);
              datas.add(obj3);	
            }
     
            public int getColumnCount()
            {
                return columnNames.length;
            }
     
            public int getRowCount()
            {
                return datas.size();
            }
     
            public String getColumnName(int col)
            {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col)
            {
              String val = "";
              MyObject obj = (MyObject)datas.get(row);
              switch (col)
              {
                case 0:
                  val = obj.getName();
                   break;
                case 1:
                  val = obj.getFirstName();
                  break;
              }
              return val;
            }
     
            public Object getValueAt(int row)
            {
              return datas.get(row);
            }
     
            public Class getColumnClass(int c)
            {
                return getValueAt(0, c).getClass();
            }
     
      private ArrayList datas = new ArrayList();
    }
    Bonne soirée

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

Discussions similaires

  1. Récupération des objets d'une association bidirectionnelle
    Par mbenameur dans le forum Doctrine2
    Réponses: 5
    Dernier message: 28/12/2012, 16h49
  2. Problème à la récupération des objets associés
    Par LinC49 dans le forum Doctrine2
    Réponses: 15
    Dernier message: 10/12/2012, 19h23
  3. Récupération des objets request et Session
    Par guillaume06 dans le forum Struts 2
    Réponses: 3
    Dernier message: 14/12/2007, 12h08
  4. [JTable] Tri des données
    Par soulhouf dans le forum Composants
    Réponses: 7
    Dernier message: 08/09/2005, 14h01
  5. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14

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