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] entourer une selection


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut [JTable] entourer une selection
    Bonjour à toutes et à tous,

    Après avoir parcouru les FAQ des différents forums anglophone et francophone (dont celui-ci) et avoir regardé les divers tutoriaux de sun, ibm, ... je viens ici avec une problématique non résolu:

    J'ai une JTable composée de plusieurs colonnes.
    Chaque colonne possède un renderer différent compte tenu de son comportement différent au niveau des couleurs

    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
    class CustomRenderer extends DefaultTableCellRenderer {
     
      ArrayList<Data> list;
     
      CustomRenderer(ArrayList<Data> dataList) {
        this.list = dataList;
      }
     
      @SuppressWarnings("unused")
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // TODO Auto-generated method stub
        Data data = this.list.getElementAt(row);
        switch (column) {
          case 0:
            this.setHorizontalAlignment(SwingConstants.CENTER);
            break;
          case 1:
            this.setHorizontalAlignment(SwingConstants.CENTER);
            break;
          case 2:
            this.setHorizontalAlignment(SwingConstants.LEFT);
            if (data.isAvailable()) {
              this.setBackground(Color.white);
            } else {
              this.setBackground(Color.red);
            }
            break;
          case 3:
            this.setHorizontalAlignment(SwingConstants.LEFT);
            if (data.getTime()> 10 ) {
              this.setBackground(Color.red);
            } else if (data.getTime()<5) {
              this.setBackground(Color.white);
            } else {
              this.setBackground(Color.orange);
            }
            break;
        }
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        return this;
      }
    Lors d'une sélection de ligne (sélection unique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setRowSelectionAllowed(true);
        table.setColumnSelectionAllowed(false);
        table.getTableHeader().setReorderingAllowed(false);
        table.getTableHeader().setResizingAllowed(false);
    le fonctionnement par défaut du JTable colore le background de chaque cellule en bleu.
    Or si certaines cases sont colorées en rouge ou orange ça ne se voit pas.
    Je désire donc empêcher la coloration d'une ligne mais à la place mettre un cadre noir de sélection.

    Or si je crée un cadre sur le renderer , je me retrouve avec chaque cellule entourée indépendamment des autres, et non une sélection entière de la ligne.

    Avec vous une idée ou un tips pour m'orienter vers le chemin de découverte afin que tel Archimède dans son bain, je puisse m'écrier moi aussi: Eurêka!!!

    Par avance je vous en remercie.

  2. #2
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut
    Bon ben au final, j'ai eu la réponse suivante que j'ai implémenter et qui marche bien:
    il suffit que le renderer étende un JLabel et mettre une bordure au JLabel correspondant à la colonne en question:
    - haut, gauche , bas pour la première colonne
    - haut, bas, droit pour la dernière
    - haut et bas pour toutes les autres

    ce qui donne:
    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
    class CustomRenderer extends JLabel implements TableCellRenderer {
     
      ArrayList<Data> list;
      final Font normalFont = new Font("SansSerif", Font.PLAIN, 12);
      final Font alertFont = new Font("SansSerif", Font.BOLD, 13);
     
      CustomRenderer(ArrayList<Data> list) {
        super();
        this.list = list;
        this.setOpaque(true);
      }
     
      @SuppressWarnings("unused")
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // TODO Auto-generated method stub
        Data data = this.list.getDataAtIndex(row);
        Border border = null;
        int align = 0;
        Color bg = Color.white;
        String s = value.toString();
        Font font = normalFont;
        switch (column) {
          case 0:
            align = SwingConstants.CENTER;
            if (isSelected) {border = BorderFactory.createMatteBorder(2, 2, 2, 0, Color.black);}
            break;
          case 1:
            align = SwingConstants.CENTER;
            if (isSelected) {border = BorderFactory.createMatteBorder(2, 0, 2, 0, Color.black);}
            break;
          case 2:
            align = SwingConstants.LEFT;
            if (isSelected) {border = BorderFactory.createMatteBorder(2, 0, 2, 0, Color.black);}
            if (!data.isProfilPlaned()) {
              bg = Color.red;
              font = alertFont;
            }
            break;
          case 3:
            align = SwingConstants.LEFT;
            if (isSelected) {border = BorderFactory.createMatteBorder(2, 0, 2, 2, Color.black);}
            if (data.getTime()> 600 ) {
              bg = Color.red;
              font = alertFont;
            } else if (data.getTime()<300) {
              bg = Color.white;
            } else {
              bg = Color.orange;
              font = alertFont;
            }
            break;
        }
        this.setBorder(border);
        this.setText(s);
        this.setToolTipText(s);
        this.setHorizontalAlignment(align);
        this.setFont(font);
        this.setForeground(Color.black);
        this.setBackground(bg);
        return this;
      }
     
    }
    voilà, merci à ceux qui m'auront lu et désolé pour le dérangement

  3. #3
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    en fait, pour la couleur du fond de la case, c'est une question d'ordre : tu mets le background rouge, puis tu appelles super.getTableCellRendererComponent, qui, si la cellule est sélectionnée, va le mettre à bleu ...
    Dans ton Renderer, il faut que la première instruction soit super.getTableCellRendererComponent(...). Ensuite, c'est toi qui customises le composant.

    Ensuite pour le cadre, c'est un peu plus chaud. Il va falloir tester si la cellule courante est sur le bord de la sélection, puis mettre une Border à toi. Les fonctions qui te seront utiles :JTable.isRowSelected, JTable.isColumnSelected.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/07/2009, 14h42
  2. afficher un jtable a partir d'une selection jlist
    Par lilmo dans le forum Composants
    Réponses: 1
    Dernier message: 31/12/2006, 10h49
  3. ajout de colonnes sur une selection
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/08/2004, 17h44
  4. [C#]Sauvegarde d'une selection multiple d'une listbox?
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/04/2004, 17h16
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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