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] Popup pour l'édition d'une cellule


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut [JTable] Popup pour l'édition d'une cellule
    Bonjour,

    J'aimerais avoir un Popup permettant d'éditer une cellule de ma JTable.
    Le popup contient des checkBoxMenuItem, ce qui permet de sélectionner plusieurs éléments en meme temps, un peu comme sur l'image suivante :

    J'aimerais savoir si il y a un autre moyen que de faire une classe qui hérite de JTable et de rédéfinir la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean editCellAt(int row, int column, EventObject e)
    Dans l'idéal, j'aimerais ne pas hériter de JTable, qqun connait-il un moyen d'y parvenir ?

    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par gids01 Voir le message
    Dans l'idéal, j'aimerais ne pas hériter de JTable, qqun connait-il un moyen d'y parvenir ?
    En affectant à la colonne concernée un TableCellEditor.

    Fred

  3. #3
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Un exemple d'implémentation :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    public class PopupEditor extends AbstractCellEditor implements TableCellEditor,
          PropertyChangeListener {
     
        private TableCellRenderer renderer;
     
        private JXPopupMenu popupMenu = new JXPopupMenu();
     
        class JXPopupMenu extends JPopupMenu {
     
          private boolean closeable;
     
          public void close() {
            closeable = true;
            setVisible(false);
          }
     
          public void setVisible(boolean b) {
            if (b || closeable) {
              super.setVisible(b);
              closeable = false;
            }
          }
        }
     
        private JButton validate = makeButton("V", Color.GREEN.darker(),
                                              new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            stopCellEditing();
          }
        });
     
        private JButton cancel = makeButton("X", Color.RED,
                                            new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            cancelCellEditing();
          }
        });
     
        private JPanel panelButtons;
     
        private JCheckBoxMenuItem[] checkBoxMenuItems;
     
        private String ws = ", ";
     
        private static final MouseListener mouseListener = new MouseAdapter() {};
     
        public PopupEditor(TableCellRenderer renderer, String[] items) {
          this.renderer = renderer;
     
          panelButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
          panelButtons.add(validate);
          panelButtons.add(cancel);
     
          setChoosableItems(items);
        }
     
        private JButton makeButton(String text, Color color,
                                   ActionListener listener) {
          JButton button = new JButton(text);
          button.setForeground(color);
          button.setBorder(BorderFactory.createRaisedBevelBorder());
          button.setFocusPainted(false);
          button.addActionListener(listener);
          return button;
        }
     
        public boolean stopCellEditing() {
          popupMenu.close();
          return super.stopCellEditing();
        }
     
        public void cancelCellEditing() {
          popupMenu.close();
          super.cancelCellEditing();
        }
     
        public void setChoosableItems(String[] items) {
          popupMenu.removeAll();
     
          this.checkBoxMenuItems = new JCheckBoxMenuItem[items.length];
          for (int i = 0; i < items.length; i++) {
            JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(items[i]);
            checkBoxMenuItems[i] = menuItem;
            popupMenu.add(menuItem);
          }
     
          popupMenu.addSeparator();
          popupMenu.add(panelButtons);
        }
     
        public Object getCellEditorValue() {
          StringBuffer sb = new StringBuffer();
          for (int i = 0; i < checkBoxMenuItems.length; i++) {
            JCheckBoxMenuItem menuItem = checkBoxMenuItems[i];
            if (menuItem.isSelected()) {
              if (sb.length() > 0) {
                sb.append(getWordSeparator());
              }
              sb.append(menuItem.getText());
            }
          }
          return sb.toString();
        }
     
        public void setCellEditorValue(Object value) {
          String[] words = value.toString().split(getWordSeparator());
          for (int i = 0; i < checkBoxMenuItems.length; i++) {
            boolean selected = false;
            JCheckBoxMenuItem menuItem = checkBoxMenuItems[i];
            String text = menuItem.getText();
            for (int j = 0; j < words.length; j++) {
              if (words[j].equals(text)) {
                selected = true;
                break;
              }
            }
            menuItem.setSelected(selected);
          }
        }
     
        public String getWordSeparator() {
          return ws;
        }
     
        public void setWordSeparator(String ws) {
          this.ws = ws;
        }
     
        public void propertyChange(PropertyChangeEvent evt) {
          if (evt.getOldValue() == this && evt.getNewValue() == null) {
            popupMenu.close();
          }
        }
     
        public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected,
                                                     int row, int column) {
          table.removePropertyChangeListener("tableCellEditor", this);
          table.addPropertyChangeListener("tableCellEditor", this);
     
          setCellEditorValue(value.toString());
     
          Rectangle rect = table.getCellRect(row, column, false);
          Dimension size = popupMenu.getPreferredSize();
          size.width = rect.width;
          popupMenu.setPreferredSize(size);
          popupMenu.show(table, rect.x, rect.y + rect.height);
     
          Component comp = renderer
              .getTableCellRendererComponent(table, value, isSelected, false, row,
                                             column);
          comp.removeMouseListener(mouseListener);
          comp.addMouseListener(mouseListener);
          return comp;
        }
      }

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/05/2009, 10h26
  2. JTable : édition d'une cellule de type Date
    Par SheikYerbouti dans le forum Composants
    Réponses: 5
    Dernier message: 08/12/2007, 08h50
  3. [JTable] Déplacer le focus et l'édition d'une cellule
    Par nicorama dans le forum Composants
    Réponses: 1
    Dernier message: 27/04/2007, 03h58
  4. [JTable] Mettre un composant Swing dans une cellule
    Par NeptuS dans le forum Composants
    Réponses: 4
    Dernier message: 09/09/2005, 12h18
  5. Quel listener pour l'édition d'une JTable?
    Par ®om dans le forum Composants
    Réponses: 4
    Dernier message: 11/05/2005, 21h13

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