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 :

Problème lors de l'inversion d'affichage de ma JTable


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut Problème lors de l'inversion d'affichage de ma JTable
    Salut à tous,

    Ma JTable est en fait un log de mon application, et donc il faut que les infos soit du plus récent au plus vieux.
    Hors ça fonctionne une fois sur deux pour le premier bouton est 0 fois pour le deuxième, sachant qu'ils font appel à la même méthode et de la même façon.
    La méthode addLog :
    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
     
    public void addLog(String message, infoMessage info)
    {
    	JTable log = IhmConverter.getInstance().getTblLog();
    	DefaultTableModel model = (DefaultTableModel) log.getModel();
    	TableCellRenderer renderer = new CustomTableCellRenderer();
    	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	Date toDay = new Date();
     
    	if (info.equals(infoMessage.info))
    	{
    		String val = dateFormat.format(toDay) +" - INFO : "+ message;
    		model.addRow(new Object[]{val});
    		model.fireTableDataChanged();
    	}
    	else if (info.equals(infoMessage.warning))
    	{
    		String val = dateFormat.format(toDay) +" - WARNING : "+ message;
    		model.addRow(new Object[]{val});
    		model.fireTableDataChanged();
    	}
    	else if (info.equals(infoMessage.error))
    	{
    		String val = dateFormat.format(toDay) +" - ERROR : "+ message;
    		model.addRow(new Object[]{val});
    		model.fireTableDataChanged();
    	}
    	((TableRowSorter<?>) log.getRowSorter()).toggleSortOrder(0); //0 = the first column
    	log.repaint();
    	log.setDefaultRenderer(String.class, renderer);
    }
    ☼ Comme vous l'avez compris le but est que ça fonctionne quelque soit le nombre de fois que j’appelle la méthode.

    Merci d'avance

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Au lieu d'appeler toggleSortOrder() à chaque fois que tu ajoutes un message (ce qui, comme son nom l'indique, inverse le tri sur la colonne), tu l'appelles qu'une seule fois à la création de la JTable, ou mieux, tu affectes un Comparator qui inverse le tri.

    Par ailleurs, inutile de faire des fireTableDataChanged(), le DefaultTableModel gère très bien tout seul les évenements. D'ailleurs, ce n'est pas un tableDataChanged mais rowsInserted qu'il faudrait envoyer.
    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.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Au lieu d'appeler toggleSortOrder() à chaque fois que tu ajoutes un message (ce qui, comme son nom l'indique, inverse le tri sur la colonne), tu l'appelles qu'une seule fois à la création de la JTable, ou mieux, tu affectes un Comparator qui inverse le tri.
    Comment je m'y prend pour faire un comparateur qui inverse le tri ?

    Car quand je le met au moment où je construit le log ça ne marche pas correctement non-plus.
    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
    tblLog = new JTable();
    DefaultTableModel model = (DefaultTableModel) tblLog.getModel();
    model.addColumn("Messages");
    tblLog.getColumnModel().getColumn(0)
    	.setCellRenderer(new CustomTableCellRenderer());
    tblLog.setAutoCreateRowSorter(true);
    ((TableRowSorter<?>) tblLog.getRowSorter()).toggleSortOrder(0);
    tblLog.setEnabled(false);
    tblLog.setBackground(Color.lightGray);
    tblLog.setGridColor(Color.lightGray);
    tblLog.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
    tblLog.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    tblLog.getSelectionModel().clearSelection();
    // constructs the popup menu
    popupMenu = new JPopupMenu();
    menuItemCopyAll = new JMenuItem("Copy All Rows");
    menuItemRemoveAll = new JMenuItem("Remove All Rows");
    menuItemCopyAll.addActionListener(new Events());
    menuItemCopyAll.setToolTipText("Click to copy all lines");
    menuItemRemoveAll.addActionListener(new Events());
    menuItemRemoveAll.setToolTipText("Click to remove all lines");
    popupMenu.add(menuItemCopyAll);
    popupMenu.add(menuItemRemoveAll);
    // sets the popup menu for the table
    tblLog.setComponentPopupMenu(popupMenu); 
    tblLog.addMouseListener(new MouseReleased(tblLog));
    elevator = new JScrollPane(tblLog,
    	JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    	JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    elevator.getViewport().setBackground(Color.WHITE);
    
    panLog = new JPanel();
    panLog.setLayout(new BorderLayout());
    panLog.add(elevator, BorderLayout.CENTER);

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nadong94 Voir le message
    Comment je m'y prend pour faire un comparateur qui inverse le tri ?
    Ceci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.getRowSorter().setComparator(0, sorter.getComparator(0).reversed());
    Citation Envoyé par nadong94 Voir le message
    Car quand je le met au moment où je construit le log ça ne marche pas correctement non-plus.
    Euh, mais ta première colonne est bien triante ascendante ? Genre c'est la date ou un timestamp, un id incrémetal... ?
    Parce que sinon, ne mets pas de row sorter et insert simplement au début au lieu d'ajouter à la fin te ligne de log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.insertRow(0, ta ligne de log);
    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.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    C'est une table d'une seule colonne avec comme première chaine un SimpleDateFormat.
    La deuxième méthode fonctionne très bien :
    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
     
    2016-04-29 11:02:31 - INFO : Link Excel sheet was created
    2016-04-29 11:02:30 - INFO : Cable Excel sheet was created
    2016-04-29 11:02:27 - INFO : Port Excel sheet was created
    2016-04-29 11:02:27 - INFO : NetworkItem Excel sheet was created
    2016-04-29 11:02:27 - INFO : NetworkList Excel sheet was created
    2016-04-29 11:02:27 - INFO : HDMT_NEMO.xlsx was created
    2016-04-29 11:02:01 - INFO : Link was created
    2016-04-29 11:02:01 - INFO : Cable was created
    2016-04-29 11:02:01 - INFO : Port was created
    2016-04-29 11:02:01 - INFO : NetworkItem was created
    2016-04-29 11:02:01 - INFO : NetworkList was created
    2016-04-29 11:01:38 - INFO : DB Config Patch Id Definition was created
    2016-04-29 11:01:38 - INFO : DB IP Definition was created
    2016-04-29 11:01:38 - INFO : DB Logical Port Allocation was created
    2016-04-29 11:01:37 - INFO : DB Connectivity Definition was created
    Et pour tester la deuxième je déclare le sorte comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tblLog.getRowSorter().setComparator(0, sorter.getComparator(0).reversed());
    Avec ceeci ça ne marche pas, car il ne reconnait pas la méthods reversed() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>();

  6. #6
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nadong94 Voir le message
    La deuxième méthode fonctionne très bien :
    Problème réglé alors.

    Citation Envoyé par nadong94 Voir le message
    Et pour tester la deuxième je déclare le sorte comment ?
    Ce serait un peu plus complexe, et inutilement plus complexe, mais faisable certes.

    Citation Envoyé par nadong94 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tblLog.getRowSorter().setComparator(0, sorter.getComparator(0).reversed());
    Avec ceeci ça ne marche pas, car il ne reconnait pas la méthods reversed() :
    C'est du Java 8.
    Sinon il faudrait faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    tblLog.getRowSorter().setComparator(0, new Comparator<Object>() {
     
    			private final Comparator<Object> c = (Comparator<Object>)tblLog.getRowSorter().getComparator(0);
     
    			@Override
    			public int compare(Object o1, Object o2) {
    				return -c.compare(o1, o2); // ou c.compare(o2,o1)
    			}
     
    		});
    Seulement, ça ne peut pas fonctionner de toute manière parce que tes données ne sont pas directement triables (techniquement si, mais pas sémantiquement, ou fonctionnellement du moins).
    Il faut donc les rendre triables en écrivant un comparateur qu'il le fait.
    A partir de la chaîne, ça consisterait soit à traiter la chaîne :
    • à couper la chaîne par un split sur espace,
    • puis de prendre les 2 premières parties, les concaténer pour réobtenir un "datetime"
    • faire un parsing avec le SimpleDateFormat utilisé pour générer ce "datetime"
    • comparer les dates
    Assez lourd donc.

    Le plus simple serait de créer une classe qui représente une ligne de log, avec les différents attributs qui la caractérisent (date, type, message...). De faire un renderer qui fait la conversion en String pour l'afficher comme actuellement, et de faire un comparateur décroissant sur l'attribut date.

    Le seul avantage de cette méthode serait de permettre à l'utilisateur de changer le tri (passer d'un ascendant à un descendant et inversement). Voire d'étendre les possibilités de tri aux autres attributs (type en particulier)
    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.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Problème réglé alors.
    Oui en effet merci bien

    Citation Envoyé par joel.drigo Voir le message
    Le seul avantage de cette méthode serait de permettre à l'utilisateur de changer le tri (passer d'un ascendant à un descendant et inversement). Voire d'étendre les possibilités de tri aux autres attributs (type en particulier)
    Dans mon cas cela n'est pas nécessaire, donc je vais opter pour la précédente façon

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/02/2010, 12h00
  2. problème lors d'un affichage!
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/07/2007, 16h04
  3. problème lors de l'affichage des images
    Par cari dans le forum Langage
    Réponses: 24
    Dernier message: 10/11/2006, 11h34
  4. [CSS] Problème lors de l'affichage d'une infobulle
    Par nais_ dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 14/09/2006, 09h59
  5. problème inversion d'affichage....???
    Par AlSvartr dans le forum Langage
    Réponses: 8
    Dernier message: 10/01/2006, 11h40

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