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

 Java Discussion :

Changer les colonnes JTABLE avec chckbox


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Changer les colonnes JTABLE avec chckbox
    Bonjour,

    J'aimerais pouvoir afficher seulement les colonnes où il y a des croix dans les checkbox, comment je peux faire merci d'avance

    Mon programme affiche un tableau :

    Nom : tableau.PNG
Affichages : 105
Taille : 10,3 Ko

    J'ai crée un Panel :

    Nom : Menu.PNG
Affichages : 101
Taille : 6,6 Ko

    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
    public class FactureTableModel extends AbstractTableModel {
     
        /**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private List<Entry<String, Facture>> factures;
     
        public FactureTableModel(Map<String, Facture> data) {
            this.factures = new ArrayList<Entry<String, Facture>>(data.entrySet()); // Idealement trier les "entry" pour avoir un affichage consistent
        }
     
     
        @Override
        public int getRowCount() {
            return factures.size();
        }
     
     
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Entry<String, Facture> player = factures.get(rowIndex);
            switch (columnIndex) {
                case 0: return player.getValue().getNumerofacture();
                case 1: return player.getValue().getIdentifiantbeneficiaire();
                case 2: return player.getValue().getIdentetat();
                case 3: return player.getValue().getNumeroamexecutant();
     
     
            }
            return null;
        }
     
     
    	@Override
    	public int getColumnCount() {
     
    		return 5;
    	}
     
     
     
     
    }
    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
    public void showtable (Map<String, Facture> data) throws IllegalAccessException, NoSuchFieldException{
     
    			JTable table = new JTable(new FactureTableModel(data));
     
    			table.getColumn("A").setHeaderValue("Numéro de facture");
    			table.getColumn("B").setHeaderValue("Identifiant beneficiaire");
    			table.getColumn("C").setHeaderValue("Identetat");
    			table.getColumn("D").setHeaderValue("Numero am executant");
     
    	        JFrame frame = new JFrame();
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        JScrollPane scrollPane = new JScrollPane(table);
    	        table.setFillsViewportHeight(true);
     
    	        frmTnr.getContentPane().add(scrollPane, BorderLayout.CENTER);
    	        frmTnr.setSize(900, 500);
    	        frmTnr.setVisible(true);
     
    	}
    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
    public class MenuModel extends JFrame {
     
    	private JPanel contentPane;
     
    	/**
             * Launch the application.
             */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					MenuModel frame = new MenuModel();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the frame.
             */
    	public MenuModel() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
     
    		JCheckBox chckbxNumeroFacture = new JCheckBox("Numero de facture");
     
    		JCheckBox chckbxIdentifiantBeneficiaire = new JCheckBox("Identifiant beneficiaire");
     
    		JCheckBox chckbxIdentEtat = new JCheckBox("Etat facture");
     
    		JCheckBox chckbxNumeroamExecutant = new JCheckBox("Numero am executant");
     
    		JButton btnAfficherTableau = new JButton("Afficher tableau");
    		btnAfficherTableau.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    			}
    		});
     
     
    		GroupLayout gl_contentPane = new GroupLayout(contentPane);
    		gl_contentPane.setHorizontalGroup(
    			gl_contentPane.createParallelGroup(Alignment.LEADING)
    				.addGroup(gl_contentPane.createSequentialGroup()
    					.addContainerGap()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addComponent(chckbxNumeroFacture)
    							.addPreferredGap(ComponentPlacement.RELATED, 214, Short.MAX_VALUE)
    							.addComponent(btnAfficherTableau))
    						.addComponent(chckbxIdentifiantBeneficiaire)
    						.addComponent(chckbxIdentEtat)
    						.addComponent(chckbxNumeroamExecutant)))
    		);
    		gl_contentPane.setVerticalGroup(
    			gl_contentPane.createParallelGroup(Alignment.LEADING)
    				.addGroup(gl_contentPane.createSequentialGroup()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    						.addComponent(chckbxNumeroFacture)
    						.addComponent(btnAfficherTableau))
    					.addPreferredGap(ComponentPlacement.RELATED)
    					.addComponent(chckbxIdentifiantBeneficiaire)
    					.addPreferredGap(ComponentPlacement.RELATED)
    					.addComponent(chckbxIdentEtat)
    					.addPreferredGap(ComponentPlacement.RELATED)
    					.addComponent(chckbxNumeroamExecutant)
    					.addContainerGap(159, Short.MAX_VALUE))
    		);
    		contentPane.setLayout(gl_contentPane);
    	}
    }

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    C'est facile avec votre FactureTableModel. Il vous faut juste le modifier un peu:

    1. Permettre au menu de signaler les colonnes à afficher.

    Ajoutez ce modèle en paramètre de votre menu et signalez au modèle les colonnes à afficher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MenuModel {
     
      public MenuModel(FactureTableModel table) {
        this.table = table;
        // ...
        btnAfficherTableau.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            String[] selectedColumns = // rechercher les colonnes sélectionnées
            table.setVisibleColumns(selectedColumns);
          }
        });
      }
    }
    2. Signaler que la structure de votre table à changé
    Dans votre modèle de table vous envoyez un évènement pour signaler que la structure de la table à changé et vous vous basez sur les colonnes à afficher pour répondre aux différentes méthodes:
    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
     
    class FactureTableModel {
      public void setVisibleColumns(String[] visibleColumns) {
        this.visibleColumns = visibleColumns; // ! L'assignation directe d'un tableau n'est pas (toujours) une bonne idée, ne vous laisse vous documenter
        fireTableStructureChanged(); // https://docs.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html#fireTableStructureChanged()
      }
     
      @Override
      public int getColumnCount() {
        return this.visibleColumns.length;
      }
     
      @Override
      public Object getValueAt(int rowIndex, int columnIndex) {
        Entry<String, Facture> facture = factures.get(rowIndex);
        String column = this.visibleColumns[columnIndex];
        // Vous avez la facture et le nom de la colonne, reste à décider quelle valeur retourner.
      }
    }
    Notez que TableModel et ces sous-classes ont une méthode getColumnName(int):String que vous pouvez utiliser pour retourner le nom de la colonne et éviter de devoir appeler table.getColumn("A").setHeaderValue("Numéro de facture");



    Si vous voulez une table évoluée (affichage des colonnes, tri, etc..) il me semble qu'il y avait la librairie SwingX qui proposait un JXTable

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci pour cette réponse,

    Si vous voulez une table évoluée (affichage des colonnes, tri, etc..) il me semble qu'il y avait la librairie SwingX qui proposait un JXTable
    Effectivement, je dois appliquer des filtres plus tard. Il faut que je change ma JTable contre une JXTable dé maintenant ? Pour l'IHM de mon programme j'utilise WindowsBuilder pour avoir accès a Design sur Eclipse.

    Au final, j'aimerais avoir un tableau où je peux choisir les colonnes à afficher et appliquer des filtres sur les colonnes, j'aimerais savoir si je suis dans la bonne démarche étant débutant en JAVA.

    Dans ma solution actuel, j'ai l'impression de me perdre et m'embrouiller et ca devient de plus en plus illisible.

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Disons que JXTable serait pratique dans votre cas. Mais cette librairie semble abandonnée et je ne sais pas comment elle s'intègre dans WindowBuildder.

    En débutant (et même après), c'est normal de parfois se sentir perdu. Par contre, rien ne vous empêche de structurer votre code afin de mieux vous y retrouver. Vous pouvez aussi vous documenter sur les patterns architecturaux et notamment MVC ou MVP qui sont assez répandus dans le développement avec Swing.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    aas
    Inscrit en
    Juin 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Algérie

    Informations professionnelles :
    Activité : aas

    Informations forums :
    Inscription : Juin 2023
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Disons que JXTable serait pratique dans votre cas. Mais cette librairie semble abandonnée et je ne sais pas comment elle s'intègre dans WindowBuildder.
    En débutant (et même après), c'est normal de parfois se sentir perdu. Par contre, rien ne vous empêche de structurer votre code afin de mieux vous y retrouver. Vous pouvez aussi vous documenter sur les patterns architecturaux et notamment MVC ou MVP qui sont assez répandus dans le développement avec Swing.
    Je ne comprends pas encore MVP. Probablement besoin d'étudier plus.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/06/2010, 11h03
  2. Réponses: 0
    Dernier message: 25/08/2009, 11h07
  3. vérouiller les colonnes JTable ?
    Par sablito dans le forum Composants
    Réponses: 3
    Dernier message: 08/12/2007, 12h42
  4. redimensionner toutes les colonnes JTable
    Par jdewalqu dans le forum Composants
    Réponses: 2
    Dernier message: 02/03/2006, 14h52
  5. [JTable] Changer les colonnes de manière dynamique
    Par gg2laba dans le forum Composants
    Réponses: 3
    Dernier message: 03/10/2005, 23h39

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