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 :

Un JPanel avec plusieurs boutons que l'on peut cliquer dans un JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut Un JPanel avec plusieurs boutons que l'on peut cliquer dans un JTable
    Bonjour,

    Voici mon soucis (qui me prend la tête depuis deux jours ! )

    J'essaie d'afficher un tableau (et les propriétés des JTable me vont bien) sauf que dans certaines cases, j'ai besoin de mettre des boutons (plusieurs par case) et que le clic sur un bouton ait un effet.

    L'affichage ne pose pas de soucis, je mets un JPanel dans ma case et avec un Renderer, il m'affiche mon JPanel

    Pour faire passer l'action c'est plus compliqué.

    Quand il n'y a qu'un bouton, je fais ca :
    - j'identifie la case : getColumAtIndexAtX(mouseClick.getX() ...
    - je "convertis mon click au bouton" : buttonEvent = (MouseEvent)SwingUtilities.convertMouseEvent(__table, mouseClick, bouton);
    -je dispatch mon clique : bouton.dispatchEvent(buttonEvent);

    Quand il y en a plusieurs, j'ai un peu tout essayer. Ma "meilleure solution" selon moi, c'etait de faire comme ca :
    - j'identifie la case : getColumAtIndexAtX(mouseClick.getX() ...
    - je "convertis mon click pour le JPanel" : buttonEvent = (MouseEvent)SwingUtilities.convertMouseEvent(__table, mouseClick, panneau);
    -je cherche le deepest component après avoir converti : componentClicked = SwingUtilities.getDeepestComponentAt((Component) panneau, buttonEvent .getX(), buttonEvent .getY());
    - et je dispatch a ce component : componentClicked.dispatch(buttonEvent)

    A savoir que j'ai tout essayé (en convertissant vers ceci, vers cela, sans convertir, blablabla jusqu'à plus soif), mais que ca marche jamais. (oui je sais, j'ai tout essayé sauf la bonne solution )

    Si j'ai bien compris je suis jamais dans le bon système de coordonnées !

    Voilà, je ne trouve de solution nulle part et je commence à perdre espoir ...

    Merci d'avance

    David

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par cygvslince Voir le message
    J'essaie d'afficher un tableau (et les propriétés des JTable me vont bien) sauf que dans certaines cases, j'ai besoin de mettre des boutons (plusieurs par case) et que le clic sur un bouton ait un effet.
    La classe "TableLayout" ci-dessous permet d'organiser des composants Swing sous la forme d'un tableau. "TableLayoutDemo" montre un exemple de la façon dont elle peut être utilisée:
    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
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    /*
     * TableLayoutDemo.java
     */
     
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
     
    public class TableLayoutDemo extends JFrame {
     
        private TableLayout tableLayout;
     
        public TableLayoutDemo() {
            super("TableLayout Demo");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(600, 300);
            setLocationRelativeTo(null);
            //create empty TableLayout:
            tableLayout = new TableLayout();
            //fill the TableLayout:
            tableLayout.addColumns("Question", "Reponses");
            tableLayout.addRow(new JLabel("Genre?"), createComponent(1));
            TableColumn column = tableLayout.getColumnModel().getColumn(0);
            column.setMinWidth(60);
            column.setMaxWidth(280);
            getContentPane().add(new JScrollPane(tableLayout), BorderLayout.CENTER);
        }
     
        private JComponent createComponent(final int type) {
            final JPanel component = new JPanel();
            if (type == 1) {
                final JButton btFemmePlus = new JButton("Femme +");
                final JButton btHommePlus = new JButton("Homme +");
                final JLabel lbFemmes = new JLabel("0");
                final JLabel lbHommes = new JLabel("0");
                final JLabel lbFemmes2 = new JLabel("femmes ");
                final JLabel lbHommes2 = new JLabel("hommes ");
                component.add(btFemmePlus);
                component.add(btHommePlus);
                component.add(lbFemmes);
                component.add(lbFemmes2);
                component.add(lbHommes);
                component.add(lbHommes2);
                ActionListener al = new ActionListener() {
     
                    public void actionPerformed(ActionEvent e) {
                        Object source = e.getSource();
                        if (source == btFemmePlus) {
                            int nbr = Integer.parseInt(lbFemmes.getText());
                            nbr++;
                            lbFemmes.setText(String.valueOf(nbr));
                        }
                        if (source == btHommePlus) {
                            int nbr = Integer.parseInt(lbHommes.getText());
                            nbr++;
                            lbHommes.setText(String.valueOf(nbr));
                        }
                    }
                };
                btFemmePlus.addActionListener(al);
                btHommePlus.addActionListener(al);
            }
            return component;
        }
     
        public static void main(final String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                    new TableLayoutDemo().setVisible(true);
                }
            });
        }
    }
     
    /*
     * TableLayout.java
     */
    class TableLayout extends JTable {
     
        /**
         * Constructs a TableLayout with 0 rows and 0 columns
         */
        public TableLayout() {
            super(0, 0);
            setDefaultRenderer(JComponent.class, new TableLayoutRenderer());
            setDefaultEditor(JComponent.class, new TableLayoutEditor());
            setSurrendersFocusOnKeystroke(true);
        }
     
        @Override
        public TableCellRenderer getCellRenderer(final int row, final int column) {
            TableColumn tableColumn = getColumnModel().getColumn(column);
            TableCellRenderer renderer = tableColumn.getCellRenderer();
            if (renderer == null) {
                Class c = getColumnClass(column);
                if (c.equals(Object.class)) {
                    Object o = getValueAt(row, column);
                    if (o != null) {
                        c = getValueAt(row, column).getClass();
                    }
                }
                renderer = getDefaultRenderer(c);
            }
            return renderer;
        }
     
        @Override
        public TableCellEditor getCellEditor(final int row, final int column) {
            TableColumn tableColumn = getColumnModel().getColumn(column);
            TableCellEditor editor = tableColumn.getCellEditor();
            if (editor == null) {
                Class c = getColumnClass(column);
                if (c.equals(Object.class)) {
                    Object o = getValueAt(row, column);
                    if (o != null) {
                        c = getValueAt(row, column).getClass();
                    }
                }
                editor = getDefaultEditor(c);
            }
            return editor;
        }
     
        /**
         *
         * @param columnNames one or more names to be added as columns
         */
        public void addColumns(final String... columnNames) {
            DefaultTableModel model = (DefaultTableModel) getModel();
            for (String name : columnNames) {
                model.addColumn(name);
            }
        }
     
        /**
         *
         * @param components one or more components to be added as a row
         */
        public void addRow(final JComponent... components) {
            DefaultTableModel model = (DefaultTableModel) getModel();
            while (model.getColumnCount() < components.length) {
                model.addColumn("");
            }
            model.addRow(components);
            int h = 0;
            for (JComponent comp : components) {
                int h2 = comp.getPreferredSize().height;
                if (h < h2) {
                    h = h2;
                }
            }
            setRowHeight(getRowCount() - 1, h);
        }
     
        class TableLayoutEditor implements TableCellEditor, Serializable {
     
            protected EventListenerList listenerList = new EventListenerList();
            protected transient ChangeEvent changeEvent = null;
            protected JComponent editorComponent = null;
     
            public Component getComponent() {
                return editorComponent;
            }
            /* implement CellEditor:
            getCellEditorValue
            isCellEditable
            shouldSelectCell
            stopCellEditing
            cancelCellEditing
            addCellEditorListener
            removeCellEditorListener
             */
     
            @Override
            public Object getCellEditorValue() {
                return editorComponent;
            }
     
            @Override
            public boolean isCellEditable(final EventObject anEvent) {
                return true;
            }
     
            @Override
            public boolean shouldSelectCell(final EventObject anEvent) {
                if (editorComponent != null && anEvent instanceof MouseEvent
                        && ((MouseEvent) anEvent).getID() == MouseEvent.MOUSE_PRESSED) {
                    Component dispatchComponent =
                            SwingUtilities.getDeepestComponentAt(editorComponent, 3, 3);
                    MouseEvent e = (MouseEvent) anEvent;
                    MouseEvent e2 = new MouseEvent(dispatchComponent,
                            MouseEvent.MOUSE_RELEASED, e.getWhen() + 100000,
                            e.getModifiers(), 3, 3, e.getClickCount(), e.isPopupTrigger());
                    dispatchComponent.dispatchEvent(e2);
                    e2 = new MouseEvent(dispatchComponent, MouseEvent.MOUSE_CLICKED,
                            e.getWhen() + 100001, e.getModifiers(), 3, 3, 1, e.isPopupTrigger());
                    dispatchComponent.dispatchEvent(e2);
                }
                return true;
            }
     
            @Override
            public boolean stopCellEditing() {
                fireEditingStopped();
                return true;
            }
     
            @Override
            public void cancelCellEditing() {
                fireEditingCanceled();
            }
     
            @Override
            public void addCellEditorListener(final CellEditorListener l) {
                listenerList.add(CellEditorListener.class, l);
            }
     
            @Override
            public void removeCellEditorListener(final CellEditorListener l) {
                listenerList.remove(CellEditorListener.class, l);
            }
     
            protected void fireEditingStopped() {//used in stopCellEditing
                Object[] listeners = listenerList.getListenerList();
                // Process the listeners last to first, notifying
                // those that are interested in this event
                for (int i = listeners.length - 2; i >= 0; i -= 2) {
                    if (listeners[i] == CellEditorListener.class) {
                        // Lazily create the event:
                        if (changeEvent == null) {
                            changeEvent = new ChangeEvent(this);
                        }
                        ((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent);
                    }
                }
            }
     
            protected void fireEditingCanceled() {//used in cancelCellEditing
                // Guaranteed to return a non-null array
                Object[] listeners = listenerList.getListenerList();
                // Process the listeners last to first, notifying
                // those that are interested in this event
                for (int i = listeners.length - 2; i >= 0; i -= 2) {
                    if (listeners[i] == CellEditorListener.class) {
                        // Lazily create the event:
                        if (changeEvent == null) {
                            changeEvent = new ChangeEvent(this);
                        }
                        ((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent);
                    }
                }
            }
     
    // implement TableCellEditor:
            @Override
            public Component getTableCellEditorComponent(final JTable table,
                    final Object value, final boolean isSelected,
                    final int row, final int column) {
                editorComponent = (JComponent) value;
                return editorComponent;
            }
        }
     
        class TableLayoutRenderer implements TableCellRenderer {
     
            @Override
            public Component getTableCellRendererComponent(final JTable table,
                    final Object value, final boolean isSelected,
                    final boolean hasFocus, final int row, final int column) {
                return (JComponent) value;
            }
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut
    Citation Envoyé par uhrand Voir le message
    La classe "TableLayout" ci-dessous permet d'organiser des composants Swing sous la forme d'un tableau. "TableLayoutDemo" montre un exemple de la façon dont elle peut être utilisée:
    Salut urhand,

    Tout d'abord, merci de ta réponse ! En effet, je ne connaissais pas cette classe et elle a l'air de faire à peu près ce que je veux.

    A quelques détails près :
    - Je ne peux pas redimensionner les colonnes de mon tableau manuellement avec cette table (comme on peut le faire avec un JTable)
    - idem pour les lignes
    - Quand je clique sur un bouton dans une case, il faut cliquer deux fois pour activer le bouton (une fois pour sélectionner la ligne et une seconde fois qui clique sur le bouton)
    - Quand j'ajoute une colonne, le titre de la colonne ne s'affiche pas. Pour compenser j'ai rajouté une ligne avec le nom de mes en-têtes, mais est-il possible de l'afficher ?

    Il y avait d'autres fonctions que je comptais utiliser comme le tri selon une colonne mais là (corrige moi si je me trompe), ça a l'air impossible (vu que les cases contiennent des JPanel). Mais je ferai mes fonctions de tri à la main

    J'ai cherché rapidement sur Google, mais je n'ai pas trouvé de solutions à ces problèmes. Si tu sais comment faire, tu m'auras complètement débloqué !

    Merci encore !

    David

    PS : si quelqu'un sait comment faire avec des JTable, je suis toujours intéressé, juste par curiosité. j'ai qd même passer deux jours non stop à chercher une solution et ça m'énerve de laisser tomber !

  4. #4
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    "TableLayout" est une solution "JTable".
    C'est la raison pour laquelle nous devons mettre la table dans un JScrollPane pour avoir les titres des colonnes, comme nous le faisons d'habitude avec un JTable:
    getContentPane().add(new JScrollPane(tableLayout), BorderLayout.CENTER);

    Du coup, tu peux redimensionner les colonnes manuellement.

    Redimensionner les lignes du tableau manuellement n'est pas prévu en standard dans JTable (je rappelle que "TableLayout" est un véritable "JTable"!). Mais ça ne devrait pas être trop difficile d'ajouter cette fonctionnalité.

    "TableLayout" étant un véritable "JTable", tu peux évidemment utiliser la fonction "RowSorter". Pour identifier l'ordre de tri des composants Swing, il suffit de mettre en place un "Comparator" par colonne, comme ceci:
    tableRowSorter.setComparator(columnIndex, new Comparator<...>() {...};

    Petite curiosité: avec le "RowSorter" la "RowHeight" ne s'adapte pas à la "PreferredSize" du composant Swing. Y remédier est facile:
    tableLayout.setRowHeight(component.getPreferredSize().height);

    Je n'ai pas encore trouvé la solution pour le problème de devoir cliquer deux fois pour activer le bouton. C'est d'autant plus difficile que le problème ne se présente pas toujours. Exemple: dans mes essais, le premier bouton de chaque ligne s'activait par simple clique.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut
    Au temps pour moi ! Je n'avais pas repris le JScrollPane !

    Merci beaucoup, je pense pouvoir me débrouiller avec tout ça ! C'est nickel !

  6. #6
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Avec bouton.setFocusable(false) le problème du clique semble résolu.

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

Discussions similaires

  1. Alert avec plusieurs boutons
    Par miketidy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/05/2008, 11h09
  2. Formulaire avec plusieurs boutons
    Par Flackou dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 05/05/2008, 18h32
  3. [DispatchAction] formulaire avec plusieurs boutons
    Par emma3345 dans le forum Struts 1
    Réponses: 3
    Dernier message: 22/11/2007, 22h52
  4. Boite de message avec plusieurs boutons
    Par niro75 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/11/2006, 12h43
  5. Un formulaire avec plusieurs boutons "submit"
    Par novices dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2006, 22h25

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