Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

JTABLE - DIVERS CELLRENDERER (TIME, DATE, BOOLEAN, STRING, ENUM, INTEGER, FLOAT, ETC.)


Information sur la source



Description

Cliquez pour voir la capture en taille normale
Etant en train de développer un PropertyTable (JTable avec 2 colonnes : 1 "propriété", l'autre "Valeur") dans le style de celle de NetBeans, j'ai dû faire plusieurs cellRenderer.

Ceux-ci sont encore en cours de développement, et j'aimerai votre avis sur ceux-ci : auriez-vous des idées d'évolutions ? Les trouvez-vous suffisament pratiques à utiliser ? Des remarques sur le code ?

Pour le CDateRenderer, je me base sur une librairie externe : celle de microba, que j'ai jointe au zip.
 

Source

  • // Voici par exemple le code du FileNameRenderer et FileEditor :
  • package composants.CustomTable;
  • import java.awt.BorderLayout;
  • import java.awt.Color;
  • import java.awt.Component;
  • import javax.swing.JButton;
  • import javax.swing.JPanel;
  • import javax.swing.JTable;
  • import javax.swing.JTextField;
  • import javax.swing.table.TableCellRenderer;
  • public class CFileNameRenderer implements TableCellRenderer {
  • private static final long serialVersionUID = 1L;
  • JTextField m_txtText;
  • JPanel m_panControl;
  • public CFileNameRenderer() {
  • super();
  • JButton m_btnFileName = new JButton("...");
  • m_panControl = new JPanel(new BorderLayout());
  • m_txtText = new JTextField();
  • m_txtText.setEditable(false);
  • m_txtText.setBackground(Color.WHITE);
  • m_panControl.add(m_txtText, BorderLayout.CENTER);
  • m_panControl.add(m_btnFileName, BorderLayout.EAST);
  • }
  • public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
  • m_txtText.setText((String) arg1);
  • return m_panControl;
  • }
  • }
  • package composants.CustomTable;
  • import java.awt.BorderLayout;
  • import java.awt.Color;
  • import java.awt.Component;
  • import java.awt.event.ActionEvent;
  • import java.awt.event.ActionListener;
  • import javax.swing.AbstractCellEditor;
  • import javax.swing.JButton;
  • import javax.swing.JFileChooser;
  • import javax.swing.JPanel;
  • import javax.swing.JTable;
  • import javax.swing.JTextField;
  • import javax.swing.SwingUtilities;
  • import javax.swing.table.TableCellEditor;
  • import affiche.CPictureFileFilter;
  • public class CFileNameEditor extends AbstractCellEditor implements TableCellEditor {
  • private static final long serialVersionUID = 1L;
  • private JPanel m_panControl;
  • private JTextField m_txtFileName;
  • private int m_iCol;
  • private int m_iRow;
  • private JTable m_oTable;
  • public CFileNameEditor() {
  • JButton m_btnFileName = new JButton("...");
  • m_panControl = new JPanel(new BorderLayout());
  • m_txtFileName = new JTextField();
  • m_txtFileName.setEditable(false);
  • m_txtFileName.setBackground(Color.WHITE);
  • m_panControl.add(m_txtFileName, BorderLayout.CENTER);
  • m_panControl.add(m_btnFileName, BorderLayout.EAST);
  • m_btnFileName.addActionListener(new ActionListener() {
  • public void actionPerformed(ActionEvent arg0) {
  • new Thread(new Runnable() {
  • public void run() {
  • SwingUtilities.invokeLater(new Runnable() {
  • public void run() {
  • JFileChooser oFile = new JFileChooser();
  • oFile.setApproveButtonText("Ouvrir");
  • oFile.setMultiSelectionEnabled(false);
  • oFile.setDialogTitle("Sélectionnez le nom du fichier d'image.");
  • oFile.setFileFilter(new CPictureFileFilter());
  • int iFileName = oFile.showDialog(m_txtFileName, "Ouvrir");
  • if (iFileName == JFileChooser.APPROVE_OPTION) {
  • String sFileName = oFile.getSelectedFile().getPath();
  • m_txtFileName.setText(sFileName);
  • m_oTable.getModel().setValueAt(m_txtFileName, m_iRow, m_iCol);
  • }
  • }
  • });
  • }
  • }).start();
  • }
  • });
  • }
  • public Component getTableCellEditorComponent(JTable oTable, Object oFileName, boolean arg2, int arg3, int arg4) {
  • m_txtFileName.setText((String) oFileName);
  • m_iRow = arg3;
  • m_iCol = arg4;
  • m_oTable = oTable;
  • return m_panControl;
  • }
  • public Object getCellEditorValue() {
  • return m_txtFileName.getText();
  • }
  • }
// Voici par exemple le code du FileNameRenderer et FileEditor :

package composants.CustomTable;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellRenderer;

public class CFileNameRenderer implements TableCellRenderer {

	private static final long serialVersionUID = 1L;
	JTextField m_txtText;
	JPanel m_panControl;
	
	public CFileNameRenderer() {
		super();
		JButton m_btnFileName = new JButton("...");
		m_panControl = new JPanel(new BorderLayout());
		m_txtText = new JTextField();
		m_txtText.setEditable(false);
		m_txtText.setBackground(Color.WHITE);
		m_panControl.add(m_txtText, BorderLayout.CENTER);
		m_panControl.add(m_btnFileName, BorderLayout.EAST);
	}

	public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
		m_txtText.setText((String) arg1);
		return m_panControl;
	}

}


package composants.CustomTable;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellEditor;

import affiche.CPictureFileFilter;

public class CFileNameEditor extends AbstractCellEditor implements TableCellEditor {

	private static final long serialVersionUID = 1L;

	private JPanel m_panControl;
	private JTextField m_txtFileName;
	private int m_iCol;
	private int m_iRow;
	private JTable m_oTable; 
	
	public CFileNameEditor() {
		JButton m_btnFileName = new JButton("...");
		m_panControl = new JPanel(new BorderLayout());
		m_txtFileName = new JTextField();
		m_txtFileName.setEditable(false);
		m_txtFileName.setBackground(Color.WHITE);
		m_panControl.add(m_txtFileName, BorderLayout.CENTER);
		m_panControl.add(m_btnFileName, BorderLayout.EAST);
		
		m_btnFileName.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				new Thread(new Runnable() {
            		public void run() {
            			SwingUtilities.invokeLater(new Runnable() {
            				public void run() {
            					JFileChooser oFile = new JFileChooser();
            					oFile.setApproveButtonText("Ouvrir");
            					oFile.setMultiSelectionEnabled(false);
            					oFile.setDialogTitle("Sélectionnez le nom du fichier d'image.");
            					oFile.setFileFilter(new CPictureFileFilter());
            					int iFileName = oFile.showDialog(m_txtFileName, "Ouvrir");
            					if (iFileName == JFileChooser.APPROVE_OPTION) {
            						String sFileName = oFile.getSelectedFile().getPath();
            						m_txtFileName.setText(sFileName);
            						m_oTable.getModel().setValueAt(m_txtFileName, m_iRow, m_iCol);
            					}
            				}
            			});
            		}
            	}).start();
			}
		});
	}
	
	public Component getTableCellEditorComponent(JTable oTable, Object oFileName, boolean arg2, int arg3, int arg4) {
		m_txtFileName.setText((String) oFileName);
		m_iRow = arg3;
		m_iCol = arg4;
		m_oTable = oTable;
		return m_panControl;
	}
	
	public Object getCellEditorValue() {
		return m_txtFileName.getText();
	}
}

Conclusion

Cette source sera mise à jour en prenant compte vos idées d'évolutions, et je posterais aussi mon PropertyTable une fois que je l'aurais fini.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Twinuts le 09/09/2006 14:39:26 administrateur CS

Salut,

c'est sympas comme tout, juste une petite remarque pour la cellule avec les bouton + et - tu aurais put mettre un JSpinner

signaler à un administrateur
Commentaire de DARKSIDIOUS le 09/09/2006 14:55:28 administrateur CS

ah, je connais pas ce contrôle, je vais regarder cà. Merci

signaler à un administrateur
Commentaire de Twinuts le 09/09/2006 15:03:40 administrateur CS

Tu peux l'utiliser avec des modèles numerique et date heure

http://java.sun.com/docs/books/tutorial/uiswing/components/spinner.html

signaler à un administrateur
Commentaire de DARKSIDIOUS le 09/09/2006 15:23:09 administrateur CS

Rah là là, si j'avais su ! Je me serais moins pris la tête pour faire les renderer pour la date et l'heure !

signaler à un administrateur
Commentaire de manawajaws le 13/09/2006 12:36:41

Salut,

Yes ça a l'air bien sympa (et c'est une bonne idée le JSpinner pour les dates etc...).
Pourrais-je te demander de poster un exemple de JTable qui utilise ces renderers et editors (dans un main par exemple) s'il te plait? Ce qui m'intéresse tout particulièrement, c'est comment tu récupères ce qui a été édité dans le JTable. Merci !

Remarque: tu utilises une classe
affiche.CPictureFileFilter
qui ne figure pas dans le classpath.

Merci et bonne continuation.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 13/09/2006 12:52:15 administrateur CS

Oui en effet, la classe CFileFilter n'est pas incluses dans ce zip, c'est un oubli, va falloir que je le mettre à jour.

Comme je l'ai dit dans la description de la source, ces CellEditor/CellRenderer ont été développés pour une PropertyTable que je mettrais sur le site dès que je l'aurais fini, donc un peu de patience est je posterai ma JTable, TableModel et tout les Filtres de fichiers utilisés.

signaler à un administrateur
Commentaire de zarda le 02/10/2006 15:04:53

salut
je voudrais dabord te remercier pour cette initiative, en effet bcp de devloppeurs rencontre des difficultés dans ces cell render et editor, j'en suis un
en faite j'ai analyser ton projet et je ne trouve toujours pas une soluce a mon pb
j'ai deja fait un ultra grand tour dans les sites et les forums avant de venir poser mon pb ici
es il possible d'inclur un combo box dans une jtable tout en gardant le combo toujours affiché en tant que comboBox dans la table et non en tant que texte , et en utilisant autre solution que celle qui utilise un String[][] pour ajouter les objets dans le combo parcque notre combo es mis a jour au fur et a mesure et meme le choix des combo peuvent intervenir dans les cases de la JTable (ajout ou supression de ligne)

je serais tres reconnaissant a celui qui m'aidera dans ce petit soucis, et je suis pret a vous fournir mes differents codes etudiés et implémentés et qui n'ont abouti a aucun resultat

merci

signaler à un administrateur
Commentaire de Twinuts le 02/10/2006 15:20:13 administrateur CS

Salut,

Afin d'obtenir une aide concrete à ton prob merci de poster dans le forum et non sur une source!

signaler à un administrateur
Commentaire de DARKSIDIOUS le 02/10/2006 18:38:55 administrateur CS

zarda : regarde le EnumRenderer/EnumEditor de ma source, ces deux classes permettent justement d'utiliser un combo pour l'affichage et la modification de valeurs !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Passer a la cellule de droite dans une JTable [ par chmurbluk ] Dans une JTable, apres la validation d'une cellule en edition par la touche Enter, la nouvelle cellule selectionnee est la cellule du dessous alors qu selection de ligne dans une JTable. [ par badboy31 ] Je developpe un ecran possedant une Jtable associé a un ListSelectionModel redeveloppé. J'aimerais savoir s'il est possible de rendre "non selectionna contraindre saisi jtable [ par blackcat ] Pour bloquer la saisi dans un jTextField on peut Redéfinir la methode de la classe PlainDocument permttant ainsi d'autoriser uniquement les caracteres afficher une JProgressBar dans une JTable [ par stephane160 ] Je suis étudiant en informatique et je réalise en ce moment un logiciel de partage de fichiers peer 2 peer en java. Je voudrais savoir comment affiche sos jtable [ par chaton6 ] je cherche désespérement coment faire pour :- Les données de mon tableau s'affiche dans une JTable. J'aimerais savoir comment faire pour faire une sai JTable [ par cloe21 ] Bonjour tout le mondeJ'ai créé une JTable. Dans une colonne il me faut appelé une JFrame de saisie de texte. Je ne vois pas comment mettre un bouton d raccourci selection dans jtable [ par benohite ] bonjour,mon probleme qui n en est pas vraiment un est le suivant:dans une jtable, on peux utilise les touches Entrer pour aller a la ligne suivante et Comment recuperer les rows d'une JTable?? [ par RustyNail ] Voila, je voudrais recuperer des rows selectionner d'une JTable pour les stocker dans une autre JTable qui devrait avoir la meme structure (memes colo JTable [ par john59 ] J'ajoute des lignes dans une JTable qui proviennent d'une requete dans une base de données. Cependant la dimension de la JTable est toujours ajustée Récupération de valeur dans une JTable... [ par Marneus ] Voilà, avec la méthode getValueAt(int, int) je réussis a obtenir ce que contient la cellule définit par les int, le problème est qu'il em retourne un


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.