Maison > Java > javaDidacticiel > Comment implémenter des cases à cocher liées dans une JTable pour la sélection de plusieurs lignes ?

Comment implémenter des cases à cocher liées dans une JTable pour la sélection de plusieurs lignes ?

DDD
Libérer: 2024-12-05 19:43:11
original
328 Les gens l'ont consulté

How to Implement Linked Checkboxes in a JTable for Multiple Row Selection?

Sélectionner plusieurs lignes et cocher toutes les cases

Dans une JTable, où une colonne comprend du texte non modifiable tandis que l'autre comporte des contrôles de case à cocher pour les valeurs booléennes, une exigence courante est de lier les cases à cocher. Cela implique que lorsque plusieurs lignes sont sélectionnées et qu'une case n'est pas cochée, toutes les autres cases sélectionnées deviennent également décochées. De même, si une case est cochée, toutes les cases sélectionnées devraient emboîter le pas.

Implémentation des cases à cocher liées

Implémentation d'une classe DataModel :

  • Étendez la classe DefaultTableModel pour créer un DataModel personnalisé avec remplacement méthodes :

    • getColumnClass(int columnIndex) : renvoie le type de classe pour la colonne de case à cocher (Boolean.class).
    • isCellEditable(int row, int column) : autorise uniquement l'édition de cellules dans la colonne des cases à cocher.

Création d'un panneau de configuration avec Boutons :

  • Ajoutez un panneau de contrôle avec des boutons pour décocher ou cocher toutes les cases sélectionnées.

Création d'une classe SelectionAction :

  • Implémentez une classe d'action pour gérer les événements de bouton.
  • Le constructeur accepte une valeur booléenne représentant l'action souhaitée (effacer ou vérifier).
  • La méthode actionPerformed parcourt les lignes sélectionnées et met à jour les valeurs des cases à cocher en conséquence.

Exemple de code :**

L'extrait de code suivant démontre le implémentation :

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.DefaultListSelectionModel;
import javax.swing.table.DefaultTableModel;

public class MultipleRowSelection extends JPanel {

    private static final int CHECK_COL = 1;
    private static final Object[][] DATA = {
        {"One", Boolean.TRUE}, {"Two", Boolean.FALSE},
        {"Three", Boolean.TRUE}, {"Four", Boolean.FALSE},
        {"Five", Boolean.TRUE}, {"Six", Boolean.FALSE},
        {"Seven", Boolean.TRUE}, {"Eight", Boolean.FALSE},
        {"Nine", Boolean.TRUE}, {"Ten", Boolean.FALSE}};
    private static final String[] COLUMNS = {"Number", "CheckBox"};
    private DataModel dataModel = new DataModel(DATA, COLUMNS);
    private JTable table = new JTable(dataModel);
    private DefaultListSelectionModel selectionModel;

    public MultipleRowSelection() {
        super(new BorderLayout());
        this.add(new JScrollPane(table));
        this.add(new ControlPanel(), BorderLayout.SOUTH);
        table.setPreferredScrollableViewportSize(new Dimension(250, 175));
        selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
    }

    private class DataModel extends DefaultTableModel {

        public DataModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == CHECK_COL) {
                return getValueAt(0, CHECK_COL).getClass();
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return column == CHECK_COL;
        }
    }

    private class ControlPanel extends JPanel {

        public ControlPanel() {
            this.add(new JLabel("Selection:"));
            this.add(new JButton(new SelectionAction("Clear", false)));
            this.add(new JButton(new SelectionAction("Check", true)));
        }
    }

    private class SelectionAction extends AbstractAction {

        boolean value;

        public SelectionAction(String name, boolean value) {
            super(name);
            this.value = value;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < dataModel.getRowCount(); i++) {
                if (selectionModel.isSelectedIndex(i)) {
                    dataModel.setValueAt(value, i, CHECK_COL);
                }
            }
        }
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("MultipleRowSelection");
        frame.add(new MultipleRowSelection());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}
Copier après la connexion

Conclusion

En implémentant ces classes et ces écouteurs d'action, il devient possible de sélectionner plusieurs lignes dans une JTable et de cocher collectivement les cases correspondantes, améliorant ainsi l'expérience utilisateur et rationalisant les données. manipulation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal