Event dans une Jtable avec colonne boolean

[Résolu/Fermé]
Signaler
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
-
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
-
Bonjour,

j'aurai besoin de votre aide pour savoir si qqun sait comment réaliser ceci :

J'ai une Jtable dans laquelle il y a 2 colonnes : 1 colonne boolean éditable, 1 colonne string non-éditable.

Cette table à environ 10 lignes avec divers choix.

Dans la 10e ligne j'aimerai que si la personne coche le boolean de la colonne 1 : alors une textbox située en dessous de la table devienne visible (ou devienne modifiable)

Plus concrètement, le 10e choix est "Autres" et si la personne coche autre, j'aimerai qu'elle puisse inscrire une donnée text.

Merci de votre aide.

Bonne journée !

--
  • Vous pouvez mettre en forme votre code grâce à la flèche en haut a droite de l'éditeur de texte.

Pensez mettre vos messages en [Résolu] et cliquer sur le + des conseil qui vous ont été utiles."

1 réponse

Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Bonjour,

A priori un Listener sur la checkBox de la dixième ligne devrait suffire pour intercepter le changement et le répercuter sur la textBox à afficher.
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
52
Merci pour votre réponse.

Le problème c'est que j'ai crée cette table via l'interface de l'IDE (Netbean). Et je n'arrive pas à trouvé le nom de la Checkbox, même en cherchant dans le code générer par l'IDE.

Je suis relativement nouveau en java. J'utilise Netbean pour crée mon projet.

Ça serait vraiment sympa une explication :)
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Bon, déjà Netbeans c'est une mauvaise idée, il fait beaucoup trop de choses et ça masque un certains nombre de mécanismes car au lieu de faire ça en pur Java il ajoute des dépendances vers ses bibliothèques qui contournent Swing.

À choisir, WindowBuilder d'Eclipse est mieux, il ne rajoute rien (sauf utilisation avancée) et en plus il est bidirectionnel, ce qui signifie que les modifications faites à la main dans le code sont visibles ensuite sur la partie graphique.

Mais pour un débutant, le mieux c'est encore de faire ça à la main.
Voici un exemple minimaliste (en pur Java) avec un PropertyChangeListener :

import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {

        final String[] columns = { "Choix", "Valeur" };
        final String[] texts = { "Tata", "Toto", "Autre" };

        final int NB_ROWS = texts.length;

        final Object[][] datas = new Object[NB_ROWS][2];
        for (int i = 0; i < NB_ROWS; i++) {
            datas[i][0] = false;
            datas[i][1] = texts[i];
        }

        final JTable table = new JTable(new DefaultTableModel(datas, columns) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int col) {
                return col == 0;
            }

            @Override
            public Class<?> getColumnClass(int col) {
                switch (col) {
                case 0:
                    return Boolean.class;
                case 1:
                    return String.class;
                default:
                    return super.getColumnClass(col);
                }
            }
        });

        final JTextField other = new JTextField("Précisez");
        other.setEditable(false);

        table.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                int row = table.getEditingRow();
                int col = table.getEditingColumn();
                if (row == -1 || col == -1)
                    return;
                datas[row][col] = table.getValueAt(row, col);
                if (row == NB_ROWS - 1 && col == 0)
                    other.setEditable((Boolean) datas[row][col]);
            }
        });

        JFrame frame = new JFrame();
        frame.add(table, BorderLayout.CENTER);
        frame.add(other, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
52 >
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021

Je vois, c'est super.

Dans ce cas là je vais plutôt me lancer dans cette direction.

Merci beaucoup du conseil !

Bonne journée :)

PS:_ juste une dernière question :

à quoi sert le "frame.pack();" à la fin du code ? Merci
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
"à quoi sert le "frame.pack();" à la fin du code ?"
Ça permet de dimensionner la fenêtre à la taille des composants qui la contienne, c'est donc la plus petite taille possible de la fenêtre sans que ce soit cassé.

Plus d'info dans la documentation : Window.pack().
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
52
Ok Merci beaucoup ;)

Vous me simplifiez la vie ;)