2008-10-03 7 views
0

J'ai une classe de table qui crée modifie un tableau d'éléments. Je veux afficher ces éléments dans un JTable en utilisant un modèle de table. Pour moi le modèle de table appartient à mon paquet d'interface graphique, mais la table a besoin d'un modèle de table pour générer des changements et le modèle de table a besoin de la classe de table pour l'afficher, donc je ne peux pas séparer les deux. Si vous avez besoin de faire cela, quelle serait la structure de classe que vous utilisez? ou ai-je un flux dans ma pensée et ils appartiennent dans le même paquet?Conception de modèle de table Java

Répondre

0

Le modèle de table n'a pas besoin de savoir quoi que ce soit sur la table dans laquelle il est placé. J'ai placé le modèle de table dans le package modèle et la table dans le package de vue. Le contrôleur est chargé de demander le modèle au modèle, de demander le package de vue pour la table et de définir ce modèle dans la table.

1

Pour moi le tablemodel fait partie du widget, c'est l'interface graphique. Je ne dépendrais pas du paquet javax.swing dans mes classes de logique métier.

Vous utiliserez donc un adaptateur ou un autre mécanisme pour charger votre modèle de tableau à partir de la couche de gestion, mais ce degré de séparation peut être utile. La décision dépend également de la taille du projet et peut être beaucoup plus complexe que cela. Par exemple. voir le cadre jgoodies binding et les docs pour les cas les plus abstraits.

1

Le modèle est le bit qui contient les données. Il devrait maintenir et tirer les auditeurs comme de tels modèles.

Désormais, vous pouvez avoir besoin d'une délégation dans le modèle pour transformer les données ou adapter le type. Vous avez donc vos données dans un objet modèle qui n'est pas forcément lié à javax.swing.table. Ensuite, implémentez un TableModel qui délègue à votre modèle sous-jacent. Créez un JTable avec ce TableModel, mais pas de référence au modèle sous-jacent.

2

Un TableModel est un adaptateur . J'écris toujours le modèle de table pour étendre AbstractTableModel et l'ai comme classe interne privée de ma classe de panneau d'interface graphique. Il vous suffit de remplir quelques méthodes: getRowCount, getColumnCount et getValueAt

Votre classe GUI devrait avoir accès à certains contrôleur où il peut remplir ces informations à partir. Lorsque votre contrôleur découvre les mises à jour des données, il doit en informer votre classe GUI qui peut ensuite appeler AbstractTableModel.fireTableDataChanged ou d'autres méthodes appropriées.

Jamais n'utilisez la classe DefaultTableModel car vous devez alors synchroniser les données du modèle de table avec celles du contrôleur. Comme je l'ai dit, le modèle de table est un adaptateur qui présente les données du contrôleur d'une manière que le JTable peut comprendre

+0

Ah, vous voulez dire que les méthodes qui doivent être mises en œuvre sont

 public int getRowCount(); public int getColumnCount(); public Object getValueAt(int row, int column); 
n'est-ce pas? – dhiller

+0

Haha oui. Oops! J'aurais dû vérifier ça en premier! –

1

Je suggère fortement que toute personne effectuant un développement important de table ou de liste jetez un oeil à Glazed Lists - J'ai écrit personnalisé TableModel et CellRenderers pendant des années, se lier avec JGoodies, etc ... J'ai trébuché sur GL à propos d'un an, et mon développement n'a jamais été le même - l'approche Glazed Lists est tout simplement stupéfiante.

GL a deux caractéristiques qui en font mon cadre de choix pour les données sur la base de la liste de liaison et de traitement:

  1. Très, très facile à faire les choses normales que vous voulez faire
  2. permet de faire les choses vraiment, vraiment dur que vous pouvez vouloir faire

Jetez un coup d'oeil et voyez si vous n'êtes pas impressionné. Je vous recommande fortement de jouer avec les exemples d'applications, puis de regarder quelques-uns des écrans qui vous guideront dans le processus de codage.

Questions connexes