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] Pb hauteur variable de cellule + édition


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Par défaut [JTable] Pb hauteur variable de cellule + édition
    Bonjour,

    J'utilise une JTable possédant les propriétés suivantes :

    1. Le renderer et l’editor font appel à une même classe Helper (mais 2 objets Helper) pour l’affichage des cellules (utile pour avoir le même rendu en affichage et en édition). Ex : appel de l’helper par le renderer :
    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
     
    public class Renderer extends DefaultTableCellRenderer {
     
    	private Helper helper = null;
     
     
    	public Renderer() {
    		this.helper = new Helper(false);
    	}
     
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		return helper.getCellComponent(table, value, row, column);
    	}
    }

    2. La hauteur des cellules est variable en fonction du contenu. Pour cela, la méthode getCellComponent () de l’helper comporte la portion de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int preferredHeight = this.getPreferredSize().height;
    if (table.getRowHeight(row) != preferredHeight) {
    	table.setRowHeight(row, preferredHeight);
    }
    Mon pb est le suivant : au premier appel de l'éditeur, la hauteur de la cellule éditée prend la hauteur par défaut des cellules de la table, si bien que le contenu est souvent tronqué. Aux appels suivants de l'éditeur, la hauteur de la cellule éditée est la hauteur désirée.

    Si besoin, je peux vous fournir un petit programme pour reproduire ce cas (200 lignes).

    Merci pour votre aide.

  2. #2
    Membre éclairé 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 : 41
    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
    Par défaut
    Si j'ai bien compris, il s'agit juste du premier appel qui ne fait pas le même affichage que les suivants ?

    Dans ce cas, as tu regardé un peu du côté des appels à show(), validate() ou encore repaint() ?
    As tu essayé de faire un fireTableChanged() ou quelque choses comme ça ?

    Pourrais tu nous montrer un peu plus de code, notament au niveau de la création et l'affichage de ta table.

    J'avais eu des problèmes d'affichage liés à un appel à la méthode pack() au mauvais endroit, au mauvais moment... En bref, je pense qu'il suffit dde demander proprement à ta table de se redessiner tel que tu le lui as demandé, une fois que tout est fixé.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Par défaut
    Si j'ai bien compris, il s'agit juste du premier appel qui ne fait pas le même affichage que les suivants ?
    Oui, c'est la première entrée en édition qui redimensionne la hauteur de la cellule éditée à la hauteur par défaut des cellules de la table.
    Ce comportement ne se reproduit pas lors des entrées en édition suivantes.


    Dans ce cas, as tu regardé un peu du côté des appels à show(), validate() ou encore repaint() ?
    J'ai essayé de faire un appel à validate() à la fin de la méthode getCellComponent() du Helper, mais sans succès...
    Pour les autres méthodes (show() et repaint()), j'avoue ne pas avoir regardé.


    As tu essayé de faire un fireTableChanged() ou quelque choses comme ça ?
    Si je ne me trompe pas, fireTableChanged() doit être appellée lorsqu'une grande partie des données du modèle d'une table sont modifiées afin de la redessiner (avec le renderer de la table). Or, ce n'est pas un pb d'affichage (renderer) mais un pb d'édition (editor).


    Sinon, afin que tu vois clairement mon pb, voici un programme permettant de le reproduire. Je l'avoue, c'est un peu long...

    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
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JTable;
     
    public class Main {
     
     
    	public static void main(String[] args) {
    		JFrame fenetre = new JFrame();
    		JTable maTable = new MaTable();
    		maTable.setVisible(true);
    		fenetre.getContentPane().setLayout(new BorderLayout());
    		fenetre.getContentPane().add(maTable, BorderLayout.CENTER);
    		fenetre.setSize(new Dimension(200, 200));
    		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenetre.setVisible(true);
    	}
    }
     
     
     
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
     
    public class MaTable extends JTable {
     
    	DefaultTableCellRenderer renderer;
     
    	TableCellEditor editor;
     
    	static String[] columnNames = { "First Name" };
     
    	static Object[][] data = { { "Une ligne suffisamment longue pour dépasser la hauteur par défaut de la cellule" },
    			{ "Alison" },
    			{ "Kathy" },
    			{ "Sharon" },
    			{ "Philip" } };
     
     
    	public MaTable() {
    		super(data, columnNames);
    		renderer = new Renderer();
    		editor = new Editor();
    		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		super.setCellEditor(null);
    		this.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    	}
     
     
    	@Override
    	public TableCellRenderer getCellRenderer(int row, int column) {
    		Object value = this.getModel().getValueAt(row, column);
    		if (value instanceof String) {
    			return renderer;
    		}
    		else {
    			throw new IllegalArgumentException("None renderer for value of class : " + value.getClass());
    		}
    	}
     
     
    	@Override
    	public TableCellEditor getCellEditor(int row, int column) {
    		Object value = this.getModel().getValueAt(row, column);
    		if (value instanceof String) {
    			return editor;
    		}
    		else {
    			throw new IllegalArgumentException("None editor for value of class : " + value.getClass());
    		}
    	}
    }
     
     
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
     
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
     
    @SuppressWarnings("serial")
    public class Helper extends JPanel {
     
    	private JPanel renderer = null;
     
    	private JTextArea espaceDemande = null;
     
     
    	/**
             * Constructeur
             * 
             */
    	public Helper(boolean isEditor) {
    		renderer = this;
    		renderer.setLayout(new BorderLayout());
     
    		// Initialise l'espace demande utilisateur
    		espaceDemande = new JTextArea("Tests");
    		espaceDemande.setLineWrap(true);
    		espaceDemande.setWrapStyleWord(true);
    		espaceDemande.setEditable(true);
    		renderer.add(espaceDemande, BorderLayout.CENTER);
    	}
     
     
    	public Component getCellComponent(JTable table, Object value, int row, int column) {
    		if (value instanceof String) {
    			String texte = (String) value;
    			espaceDemande.setText(texte);
     
    			// Spécifie la hauteur de la ligne
    			int preferredHeight = this.getPreferredSize().height;
    			if (table.getRowHeight(row) != preferredHeight) {
    				table.setRowHeight(row, preferredHeight);
    			}
    		}
    		return this;
    	}
     
     
    	public String getCellEditorValue() {
    		return espaceDemande.getText();
    	}
    }
     
     
     
     
    import java.awt.Component;
     
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.border.Border;
    import javax.swing.border.EmptyBorder;
    import javax.swing.table.DefaultTableCellRenderer;
     
    @SuppressWarnings("serial")
    public class Renderer extends DefaultTableCellRenderer {
     
    	private Helper helper = null;
     
     
    	public Renderer() {
    		this.helper = new Helper(false);
    	}
     
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
    			int row, int column) {
    		return helper.getCellComponent(table, value, row, column);
    	}
    }
     
     
     
    import java.awt.Component;
    import java.util.EventObject;
     
    import javax.swing.AbstractCellEditor;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
     
    @SuppressWarnings("serial")
    public class Editor extends AbstractCellEditor implements TableCellEditor {
     
    	private Helper helper = null;
     
     
    	public Editor() {
    		this.helper = new Helper(true);
    	}
     
     
    	/**
             * 
             */
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    		return helper.getCellComponent(table, value, row, column);
    	}
     
     
    	public Object getCellEditorValue() {
    		// TODO Auto-generated method stub
    		return helper.getCellEditorValue();
    	}
     
     
    	public boolean isCellEditable(EventObject anEvent) {
    		// TODO Auto-generated method stub
    		return true;
    	}
    }
    En cliquant sur la première cellule du tableau, elle rentre en édition et sa hauteur devient la hauteur par défaut des cellules de la table.

    Remarque : J'utilise le jdk5.0

  4. #4
    Membre éclairé 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 : 41
    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
    Par défaut
    Je suis désolé, je suis un peu débordé en ce moment, et je n'ai pas trop le temps de tester ce que tu as fait.

    Par contre, j'ai dans mon code, une table avec des lignes de 45 pixels de hauteur, et cette dernière s'affiche sans problème, correctement, dès le début.

    Pour cela, voici mon algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    JTable maTable = new JTable(getMonModel());
    maTable.getColumnModel().getColumn(Constants.COLUMN_NEW_VALUE).setCellRenderer(new MonCellRenderer());
    maTable.setRowHeight(45);
    maTable.setAlignmentY(0);
     
    JScrollPane scsrollPane = new JScrollPane(maTable);
    JPanel panel = new JPanel();
    panel.add(scrollPane, BorderLayout.CENTER);
     
    scrollPane.setVisible(true);
    panel.setVisible(true);
    Car en fait, je me demande si dans ton code, pour le premier passage, ne serait pas appelé le getComponent() avant que ne soit défini la preferredSize...

    Voilà, si ça peut aider

Discussions similaires

  1. JTable: ajuster la hauteur d'une cellule automatiquement
    Par cisnake dans le forum Composants
    Réponses: 0
    Dernier message: 08/11/2012, 12h41
  2. [JTable] Déplacer le focus et l'édition d'une cellule
    Par nicorama dans le forum Composants
    Réponses: 1
    Dernier message: 27/04/2007, 03h58
  3. [JTable] Personnaliser le tooltip par cellule
    Par bibx dans le forum Composants
    Réponses: 3
    Dernier message: 10/02/2005, 17h54
  4. [JTable] Empêcher sélection de certaines cellules
    Par Oliveuh dans le forum Composants
    Réponses: 6
    Dernier message: 28/07/2004, 12h47
  5. [JTable]Aligner le contenu des cellules
    Par )3lade dans le forum Composants
    Réponses: 2
    Dernier message: 09/03/2004, 13h24

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