Question

Existe-t-il des livres ou un site Web valables qui créent un JTable ? Je veux rendre une colonne modifiable. Je voudrais réellement mettre un composant JCheckBox hérité (que nous avons créé ici) dans l'une des colonnes de la table au lieu de simplement mettre la table JCheckBox dans le fait qu'il s'agisse d'un champ booléen éditable.

J'ai le livre Tutoriel JFC Swing, deuxième édition , mais je voudrais simplement voudrais savoir s’il existe d’autres exemples que je pourrais regarder et apprendre à mieux gérer les tables. Le livre semble simplement prendre le "sentier" java en ligne et le mettre dans le livre.

Je suis en train de relire le texte, mais je suis curieux de savoir si quelqu'un a trouvé quelque chose qui pourrait aider davantage.

Était-ce utile?

La solution

Pour rendre une colonne modifiable, vous devez remplacer la méthode isCellEditable dans le TableModel . Créer un TableModel est assez facile si vous héritez de AbstractTableModel et que je le recommanderais pour tous les JTable s les plus simples.

Cependant, l’adaptation du TableModel ne constitue qu’une partie de ce que vous devez faire. Pour obtenir un composant personnalisé dans la JTable , vous devez définir un rendu de cellule personnalisé. Pour utiliser un composant personnalisé interactif, vous devez définir un éditeur de cellule personnalisé. Dans certains cas, il suffit pour cela d'utiliser des versions légèrement modifiées des classes par défaut.

Éditeurs

Si vous avez déjà un composant personnalisé, utilisez facilement la délégation: créez une nouvelle classe implémentant TableCellEditor et renvoyez une nouvelle instance du composant dans le méthode getCellEditorComponent . Les paramètres de cette méthode incluent la valeur actuelle ainsi que les coordonnées de la cellule, un lien vers la table et si la cellule est sélectionnée ou non.

TableCellEditor a également une méthode appelée lorsque l'utilisateur valide une modification du contenu de la cellule (où vous pouvez valider la saisie de l'utilisateur et ajuster le modèle) ou annuler une modification. Assurez-vous d’appeler la méthode stopEditing () dans votre éditeur si vous annulez l’édition par programmation, sinon le composant éditeur restera à l’écran - cela m’a pris 2 heures à déboguer.

Notez que dans les éditeurs JTable et les éditeurs uniquement , les événements sont reçus! L'affichage d'un bouton peut être fait en utilisant un moteur de rendu. Mais pour obtenir un bouton qui fonctionne, vous devez implémenter un éditeur avec le EventListeners correct enregistré. Enregistrer un écouteur sur un rendu ne fait rien.

moteurs de rendu

La mise en œuvre d'un moteur de rendu n'est pas strictement nécessaire pour ce que vous décrivez dans votre question, mais vous finissez généralement par le faire, même s'il ne s'agit que de modifications mineures. Les moteurs de rendu, contrairement aux éditeurs, sont critiques pour la vitesse. Le getTableCellRendererComponent d'un rendu est appelé une fois pour chaque cellule de la table! Le composant renvoyé par un rendu est uniquement utilisé pour peindre la cellule, et non pour l'interaction, et peut donc être " réutilisé " pour la cellule suivante. En d'autres termes, vous devez ajuster le composant (par exemple, en utilisant setText (...) ou setFont (...) s'il s'agit d'un TextComponent ) dans le rendu, vous ne devriez pas en instancier un nouveau - c’est un moyen facile de paralyser la performance.

Mises en garde

Notez que pour que les moteurs de rendu et les éditeurs fonctionnent, vous devez indiquer à la JTable quand utiliser un certain moteur de rendu / éditeur. Il y a fondamentalement deux façons de faire cela. Vous pouvez définir le rendu / éditeur de cellule par défaut pour un certain type à l'aide des méthodes JTable respectives. Pour que cette méthode fonctionne, votre TableModel doit renvoyer exactement ce type dans la méthode getColumnClass (...) ! Le modèle de table par défaut ne ne ne le fera pas pour vous, il retourne toujours Object.class . Je suis sûr que l’on a surpris beaucoup de monde.

L'autre façon de définir l'éditeur / le rendu consiste à la définir explicitement sur la colonne elle-même, c'est-à-dire en obtenant le TableColumn via getTableColumn (...) méthode de la JTable . C'est beaucoup plus élaboré, mais c'est aussi le seul moyen d'avoir deux moteurs de rendu / éditeur différents pour une même classe. Par exemple. votre modèle peut avoir deux colonnes de la classe String qui sont rendues de manière totalement différente, peut-être une fois en utilisant un JLabel / DefaultRenderer et l'autre en utilisant un JButton pour accéder à un éditeur plus élaboré .

JTable avec ses moteurs de rendu et ses éditeurs personnalisés est extrêmement polyvalent, mais il est également difficile à prendre en compte et il y a beaucoup de choses à faire de mal. Bonne chance!

Comment utiliser les tableaux dans Le didacticiel Swing est une lecture obligatoire pour quiconque personnalise JTables. En particulier, lisez et relisez Concepts: Editeurs et moteurs de rendu car il faut généralement un certain temps pour que celui-ci "clique". Les exemples sur les moteurs de rendu et les éditeurs personnalisés sont également très utiles.

Autres conseils

La classe que vous souhaitez explorer pour créer votre propre comportement est DefaultTableModel. Cela vous permettra de définir votre propre comportement. Vous pouvez trouver un didacticiel correct sur le site de sun .

Ce tutoriel tiré du lobby java est facile à suivre. La piste d'orientation pour JTable en ligne que vous avez référencée indique qu'il a été mis à jour. Avez-vous parcouru l’ensemble du document pour rechercher une meilleure information (la nouvelle n'est-elle pas toujours meilleure)?

Si vous essayez d'utiliser un simple JTable avec 1 colonne éditable et que vous connaissez l'emplacement de la colonne, vous pouvez toujours utiliser le modèle de table par défaut et surcharger l'appel isCellEditable .

quelque chose comme ceci:

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});

Et pour la case à cocher créer une classe de rendu

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer

Certaines classes utiles sont:

Package javax.swing.table :

TableModel - Interface pour un modèle de tableau AbstractTableModel - Belle classe à étendre pour créer votre propre table avec des structures de données personnalisées DefaultTableModel - Modèle de table par défaut pouvant traiter les tableaux [] et Vecteurs

Pour désactiver la modification sur toute cellule, vous devez remplacer la méthode isCellEditable (int row, int col)

.

dans votre modèle de table, vous devez remplacer "isCellEditable". et " setValueAt " fonctions, comme ci-dessous.
La colonne 4 est la colonne des cellules modifiables.
Ensuite, lorsque vous double-cliquez sur la cellule et tapez quelque chose,
setValueAt () sera appelée et enregistrera la valeur dans le champ DO de la tableModel, col4.

public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table

@Override
public boolean isCellEditable(int row, int col) {
    if (col == 4) {
        return true;
    } else {
        return false;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
        if (col == 4) {
            tbmData.get(row).col4= (String) value;
        }
        fireTableCellUpdated(row, col);
    } else {
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top