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

Composants Java Discussion :

[JTable]Affichage avec un modèle dynamique impossible


Sujet :

Composants Java

  1. #1
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut [JTable]Affichage avec un modèle dynamique impossible
    Bonjour tout le monde.

    Je crois que j'ai simplement besoin de regard extérieur sur mon programme pour trouver la bête erreur qui m'empêche d'afficher mon JTable basé sur un JModel dynamique.

    Voilà le problème: j'ai un panneau dans lequel j'ai des boutons et une table. La table, et son contenu ne doivent s'afficher qu'après avoir appuyer sur certains boutons et ensuite, si on appuie sur de nouveaux boutons, le contenu de la table doit évoluer.
    J'ai donc créé un TableModel "perso" qui va chercher ses données dans un BD en fonction des boutons qui ont été cliqué dans ma fenêtre.
    Après test, mon tableModel se rempli bien, et avec les bonnes données.
    Cependant, impossible de faire apparaître la table ! Alors que si je mets des données statiques... (je rempli à la main 2 vecteurs...) elle s'affiche !!!

    Voici mon code, dans lequel j'ai changé la création de ma table via le modèle en table créée selon 2 tableaux, que je rempli dynamiquement. La non plus, ça ne marche pas. (alors que si je mets des valeurs statiques dans ces mêmes tableaux ça marche !)
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    public JPanel getDisplayPanel() {
    	if(displayPanel == null){
    		displayPanel = new JPanel(new BorderLayout());
     
    		displayPanel.add(getClassPanel(), BorderLayout.NORTH);
    		displayPanel.add(getValueTablePanel(), BorderLayout.CENTER);
    		displayPanel.add(getButtonPanel(), BorderLayout.SOUTH);
    	}
     
    	if(domain==null){
    		displayPanel.setVisible(false);
    	}else{
    		displayPanel.setVisible(true);
    	}
     
    	return displayPanel;
    }
     
    public JPanel getValueTablePanel() {
    	if (valueTablePanel==null){
    		valueTablePanel = new JPanel(new BorderLayout());
     
    		JScrollPane scrollPane = new JScrollPane(getIndicatorsTable());
    		valueTablePanel.add(scrollPane, BorderLayout.CENTER);
    	}
     
    	if(domain==null || domainClass==null){
    		System.out.println("-----> valueTable.setVisible(false)");
    		valueTablePanel.setVisible(false);
    	}else{
    		System.out.println("--------> valueTable.setVisible(true)");
    		valueTablePanel.setVisible(true);
    	}
     
    	return valueTablePanel;
    }
     
    public JTable getIndicatorsTable() {
    	//if (indicatorsTable == null){
    	logicalModel = new ValueTableModel(this);
    	Indicator[] indicators = ((ValueTableModel)logicalModel).getIndicators();
    	Object[] columnHeaders = new Object[((ValueTableModel)logicalModel).getColumnCount()];
     
    	if(indicators!=null){
    		if(indicators.length>0){
    			for(int i=0; i<columnHeaders.length; i++){
    				columnHeaders[i] = ((ValueTableModel)logicalModel).getColumnName(i);
    				System.out.println("columnHeaders["+i+"] -> "+columnHeaders[i]);
    			}
     
    			Object[][] dataValues = new Object[((ValueTableModel)logicalModel).getRowCount()][((ValueTableModel)logicalModel).getColumnCount()];
    			for(int i=0; i<((ValueTableModel)logicalModel).getRowCount(); i++){
    				for(int j=0; j<((ValueTableModel)logicalModel).getColumnCount();j++){
    					if(((ValueTableModel)logicalModel).getValueAt(i, j)!=null)
    						dataValues[i][j] = ((ValueTableModel)logicalModel).getValueAt(i, j);
    					else
    						dataValues[i][j] = "No value";
    					System.out.println("--> dataValues["+i+"]["+j+"] -> "+dataValues[i][j]);
    				}
    			}
     
    			//SI LE MODELE SUIVANT RECOIT DEUX TABLEAUX STATIQUES... ALORS LA TABLE S'AFFICHE
    			//POURTANT, GRACE AUX AFFICHAGES CI-DESSUS, JE SAIS QUE MES TABLEAUX ONT BIEN DES DONNEES...
    			DefaultTableModel atm = new DefaultTableModel(dataValues, columnHeaders);
    			//SI J'UTILISE DIRECTEMENT MON MODELE (COMME JE VOUDRAIS LE FAIRE)... BEN CA MARCHE PAS !
    	//		indicatorsTable = new JTable(getLogicalModel());
    			indicatorsTable = new JTable(atm);	//DANS TOUS LES CAS (SAUF AVEC DES TABLEAUX STATIQUES),
    			//MON PANNEAU S'AFFICHE SANS SCROLLBAR, ET RESTE VIDE... (LES PANNEAUX AUTOUR S'AFFICHENT !)
    		}
    	}
     
    	return indicatorsTable;
    }
     
    public TableModel getLogicalModel() {
    	if(domain!=null && domainClass!=null){
    		logicalModel = new ValueTableModel(this);
    	}
     
    	if(logicalModel!=null){
    		System.out.println("==> nbCol : "+logicalModel.getColumnCount()+" rowCount "+logicalModel.getRowCount()+"  "+logicalModel.toString());
    	}
     
    	return logicalModel;
    }

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ta méthode getLogicalModel() me semble bizarre... Est-ce que tu es sûr qu'elle te renvoit bien une valeur non-null ??

    Sinon fait voir un peu ton TableModel...

    a++


    PS : Un conseil : évite de faire des casts dans tous les sens cela rend le code difficilement lisible... si tu as besoin d'utiliser des méthodes spécifique de ton TableModel, déclare le avec son vrai type...

  3. #3
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Je viens de vérifier, en mettant un petit test, et je confirme, ma méthode getLogicalModel() ne me renvoiie pas null (en tout cas, pas quand j'essaie de l'utiliser... )

    Sinon voici un morceau de mon ValueTableModel() (je vous passe setValueAt()...)
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    private MyObject[] myObjects = null;
    private Object[] dataValues = null;
     
    public ValueTableModel(MySoft2 parent){
    	super();
    	mainFrame = parent;
     
    	System.out.println("Model créé");
     
    	if(mainFrame.getDomain()!=null && mainFrame.getDomainClass()!=null){
    		if(mainFrame.getDomain().equals(Constants.ACTIVITY)){
    			myObjects = (MyObject[]) MySoft2.getMySoftDB().getMyObjects(mainFrame.getDomain());
    			System.out.println("myObjects Rempli");
    		}else{
    			myObjects = (MyObject[]) MySoft2.getMySoftDB().getMyObjects(mainFrame.getDomain(), mainFrame.getDomainClass());
    			System.out.println("myObjects Rempli 2");
    		}
     
    		if(mainFrame.getDomainClass().equals(Constants.DOCUMENTATION)){
    			dataValues = new ButtonPanel[myObjects.length];
    			for(int i=0;i<dataValues.length;i++){
    				dataValues[i]=new ButtonPanel();
    			}
    		}else{
    			dataValues = new Object[myObjects.length];
    		}
    	}
    }
     
    public Object getValueAt(int row, int col){
    	Object columnValue = null;
     
    	switch (col){
    		case Constants.COLUMN_NAME:
    			columnValue = myObjects[row].getName();
    			break;
     
    		case Constants.COLUMN_CLASS:
    			columnValue = myObjects[row].getClassInd();
    			break;
     
    		case Constants.COLUMN_RISK:
    			columnValue = new Boolean(myObjects[row].isMajorRisk());
    			break;
     
    		case Constants.COLUMN_RECORD:
    			columnValue = myObjects[row].getRecordFreq();
    			break;
     
    		case Constants.COLUMN_REPORT:
    			columnValue = myObjects[row].getReportFreq();
    			break;
     
    		case Constants.COLUMN_UNIT:
    			columnValue = myObjects[row].getUnit();
    			break;
     
    		case Constants.COLUMN_OLD_VALUE:
    			if (mainFrame.getDomainClass().equals(Constants.PRACTICE)){
    				columnValue = new Integer(myObjects[row].getValue());
    			} else{ // This is the documentation type, so value should be -1, 0 or 1
    				switch (myObjects[row].getValue()){
    					case -1:
    						columnValue = Constants.ABSENT;
    						break;
     
    					case 0:
    						columnValue = Constants.INSUFFICIENT;
    						break;
     
    					case 1:
    						columnValue = Constants.VALIDATED;
    						break;
     
    					default:
    						break;
    				}
    			}
    			break;
     
    		case Constants.COLUMN_NEW_VALUE:
    			columnValue = dataValues[row];
    			break;
     
    		default:
    			break;
    	}
     
    	return columnValue;
    }
     
    public String getColumnName(int col){
    	String columnName = null;
     
    	switch (col){
    		case Constants.COLUMN_NAME:
    			columnName = new String("<HTML><CENTER>Name</CENTER></HTML>");
    			break;
     
    		case Constants.COLUMN_CLASS:
    			columnName = new String("Class");
    			break;
     
    		case Constants.COLUMN_MAJOR:
    			columnName = new String("<HTML><CENTER>Major</CENTER></HTML>");
    			break;
     
    		case Constants.COLUMN_FREQ1:
    			columnName = new String("<HTML><CENTER>Freq 1</CENTER></HTML>");
    			break;
     
    		case Constants.COLUMN_FREQ2:
    			columnName = new String("<HTML><CENTER>Freq 2</CENTER></HTML>");
    			break;
     
    		case Constants.COLUMN_UNIT:
    			columnName = new String("Unit");
    			break;
     
    		case Constants.COLUMN_OLD_VALUE:
    			columnName = new String("<HTML><CENTER>Old<BR>value</CENTER></HTML>");
    			break;
     
    		case Constants.COLUMN_NEW_VALUE:
    			columnName = new String("<HTML><CENTER>New<BR>value</CENTER></HTML>");
    			break;
     
    		default:
    			break;
    	}
     
    	return columnName;
    }
     
    public boolean isCellEditable(int line, int col)
    {	return (col == Constants.COLUMN_NEW_VALUE) ;	}
     
    public Class getColumnClass(int col){
    	switch (col){
    		case Constants.COLUMN_MAJOR:
    			return Boolean.class;
     
    		case Constants.COLUMN_NEW_VALUE:
    			return mainFrame.getDomainClass().equals(Constants.DOCUMENTATION) ? ButtonPanel.class : String.class;
     
    		default:
    			return String.class;
    	}
    }
    PS : Ce qui est "marrant", c'est que quand j'essaie de mettre cette même table dans une autre fenêtre (disons une JDialog, vu que c'est celle que j'ai essayé...) ça marche !

  4. #4
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Je me demande si j n'ai pas bettement un problème de raffraichissement de ma fenêtre et de mon panel.
    Je viens de mettre sur mon action boutton une "double réaction" :
    1. J'essaie d'afficher le panel dans ma fenêtre principale (JFrame), en insérant ma JTable dans un JScrollPane
    2. Je mets cette même JTable dans un JScrollPane que j'insère dans le contentPane d'une JDialog.

    L'affichage dans la JDialog est exactement ce que je veux (contenu de ma JTable ainsi que les différents JPanel...), tandis que rien ne s'affiche dans ma fenêtre principale !

    Qu'en pensez vous ? Le voyez vous dans mon code ?

    Par avance, Merci.

  5. #5
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    OK, c'est bon, surtout ne vous prenez pas la tête, je viens de trouver.

    Pour être sûr que tout serait bien clean, j'ai fait une trace de tout mon programme en le déroulant tranquillement, et en regardant méthode par méthode qui fait quoi, quel affichage se fait quand, et j'ai pas mal épuré...

    Je me retrouve avec un code un peu plus clair, et sans erreur

    J'ai une deadline qui s'approche à grand pas, je vais donc attendre qu'elle passe avant de partager mon code, si il peut aider quelqu'un.

    Encore merci adiGuba et désolé de t'avoir fait perdre du temps à cause d'une "bêtise".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Effacer affichage JTable avec modèle dynamique
    Par Yann_69 dans le forum Composants
    Réponses: 4
    Dernier message: 31/05/2012, 08h56
  2. Réponses: 5
    Dernier message: 27/09/2006, 14h07
  3. Problème d'affichage avec le composant JTable
    Par vidocq dans le forum Composants
    Réponses: 2
    Dernier message: 03/04/2006, 11h22
  4. Réponses: 6
    Dernier message: 10/11/2005, 08h58
  5. [JTable] Problème avec le modèle
    Par etiennegaloup dans le forum Composants
    Réponses: 2
    Dernier message: 20/09/2005, 16h25

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