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 :

Barregraphe dans une cellule de JTable


Sujet :

Composants Java

  1. #1
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut Barregraphe dans une cellule de JTable
    Bonjour,

    ce sujet maintes fois abordé sur Internet ne trouve pas de solution à mon goût.
    Voilà ce que je voudrais faire:
    Nom : Chart JTable.jpg
Affichages : 94
Taille : 44,2 Ko

    Les barregraphes doivent pouvoir descendre avec les lignes de la JTable, afin de défiler avec un JScrollPane.
    Je pense donc qu'il faut intégrer ces barres dans les cellules cellules de la dernière colonne.

    La piste que j'explore actuellement est la suivante:
    - les cellules d'une JTable sont des JLabel,
    - il est possible de définir dans le Renderer de la JTable, une icône pour ces JLabel.

    Mon problème:
    - Comment créer/dessiner une icône avant de l'affecter à une cellule ?

    J'ai vraiment besoin de créer l'icône, pas simplement de charger un fichier représentant une image de rectangle.
    Car je doit pouvoir définir la couleur, parfois faire un contour à la barre...

    Quelqu'un a-t-il une idée ?
    @ bientôt...

    Salut & @+ sur 3W!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux tout simplement prévoir une colonne pour afficher la barre d'histogramme, et faire un TableCellRenderer qui dessine la barre à partir d'un Canvas : il suffit d'associer ce renderer avec la colonne qui affiche la barre.

    Par exemple, voici un POC (pour faciliter le rendering, j'ai fait une classe pour représenter la barre (BarData)) :

    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
    public class Demo { 
     
    	private final static Color[] COLORS = {Color.RED,Color.BLUE,Color.GREEN};
    	public static void main(String[] args) {
     
     
     
    		JFrame frame = new JFrame("Demo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
    		final JTable table = createJTable();
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		panel.add(table, BorderLayout.CENTER);
    		panel.add(new JButton(new AbstractAction("Change data") {
     
    			private final Random random = new Random();
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				TableModel model = table.getModel();
    				int rowCount = model.getRowCount();
    				for(int row=0; row<rowCount; row++) {
    					model.setValueAt(new BarData(random.nextInt(100), COLORS[row]),row, 2);
    				}
    			}
     
    		}),BorderLayout.SOUTH);
    		frame.getContentPane().add(panel);
     
    		frame.pack();
     
    		//frame.setSize(200, 200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static JTable createJTable() {
     
     
    		JTable table = new JTable(new DefaultTableModel(new Object[][] {
     
    				{ 10, "truc", new BarData(30, Color.RED) },
    				{ 10, "bidule", new BarData(75, Color.BLUE) },
    				{ 10, "truc", new BarData(10, Color.GREEN) }
     
    		},
    		new String[] {"Col1", "Col2", "Col3"} ) {
    			@Override
    			public Class<?> getColumnClass(int columnIndex) {
    				switch (columnIndex) {
    				case 0:
    					return Integer.class;
    				case 1:
    					return String.class;
    				case 2:
    					return BarData.class;
    				default:
    					break;
    				}
    				return Object.class;
    			}
    		});
     
     
    		table.setDefaultRenderer(BarData.class, new BarDataCellRenderer());
     
    		return table;
     
    	}
     
     
    	private static class BarData {
     
    		private int value;
    		private Color color;
     
    		public BarData(int value, Color color) {
    			this.value=value;
    			this.color=color;
    		}
     
    	}
     
    	private static class BarDataCellRenderer extends Canvas implements TableCellRenderer {
     
    		private int value;
    		private Color color;
     
    		@Override
    		public Component getTableCellRendererComponent(JTable table,
    				Object value, boolean isSelected, boolean hasFocus, int row,
    				int column) {
    			if ( value instanceof BarData ) {
    				BarData data = (BarData) value;
    				this.value = data.value;
    				this.color = data.color;
    			}
    			else {
    				this.value=0;
    			}
    			return this;
    		}
     
    		@Override
    		public void paint(Graphics g) {
    			super.paint(g);
    			if ( value>0 ) {
    				g.setColor(color);
    				g.fillRect(0, 0, (int)(getWidth()*(value/100d)), getHeight());
    			}
    		}
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour Joël,

    merci pour cette piste. Je n'ai pas pensé à surcharger paint() pour le composant...
    J'expérimente cela...
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Merci Joël pour ce tuyau.

    j'ai adapté ce bout de code à mon application et cela fonctionne parfaitement.
    Votre solution mériterait de figurer dans la FAQ car cette question est beaucoup posée sur Internet.
    @ bientôt...

    Salut & @+ sur 3W!

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    De rien

    Oui, il fallait adapter (on peut par exemple simplement étendre le DefaultTableCellRenderer, pour avoir directement la gestion de la sélection et du focus : il suffit de penser à faire setText("") pour que la valeur ne s'affiche pas).

    Oui, pourquoi pas en FAQ, ou en tutoriel, sur les renderers de JTable...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/03/2010, 16h23
  2. Calcul dans une cellule de jTable
    Par L'aigle de Carthage dans le forum Composants
    Réponses: 1
    Dernier message: 12/11/2009, 15h49
  3. date dans une cellule de jTable
    Par norkoffire dans le forum Composants
    Réponses: 4
    Dernier message: 14/06/2007, 17h27
  4. Texte sur plusieurs lignes dans une cellule de JTable
    Par JeanECN dans le forum Composants
    Réponses: 3
    Dernier message: 10/04/2006, 18h20
  5. [SWING][JTable] mettre une URL dans une cellule de JTable
    Par PoPeio dans le forum Composants
    Réponses: 4
    Dernier message: 10/03/2006, 13h00

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