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.
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 {
}
}