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
| public class TableCellRendererExemple {
public static void main(String[] args) {
// je créé mes données :
String[] columns = new String[10]; // 10 colonnes0
for(int i=0; i<columns.length; i++) {
columns[i]="Col " + (i+1);
}
Object[][] data = new Object[10][columns.length]; // 10 lignes
// je remplis aléatoirement
Random random = new Random();
for(Object[] ligne : data) {
for(int i=0; i<ligne.length; i++) {
ligne[i] = new TroisValeurs(random.nextInt(10),random.nextInt(10),random.nextInt(10));
}
}
// je créé l'instance de renderer
TableCellRenderer renderer = new TroisValeursRenderer();
// on crée un modèle juste pour pouvoir paramétrer la classe des valeurs
TableModel model = new DefaultTableModel(data, columns) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return TroisValeurs.class;
}
};
// je créé la JTable
JTable table = new JTable(model);
table.setDefaultRenderer(TroisValeurs.class, renderer); // j'associer le renderer au type que je veux dessiner avec ce renderer
// une fenêtre pour l'affichage
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// un panel pour afficher la JTable
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(table));
panel.add(table.getTableHeader(), BorderLayout.NORTH);
frame.add(panel);
// affichage de la fenêtre
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static class TroisValeursRenderer extends JPanel implements TableCellRenderer {
private JLabel jlabel1;
private JLabel jlabel2;
private JLabel jlabel3;
public TroisValeursRenderer() {
// pour afficher mes valeurs, je vais utiliser trois labels:
jlabel1 = new JLabel();
jlabel2 = new JLabel();
jlabel3 = new JLabel();
// un peu de décoration pour ces labels :
Border border = BorderFactory.createLoweredSoftBevelBorder();
decorate(jlabel1,border);
decorate(jlabel2,border);
decorate(jlabel3,border);
setLayout(new GridBagLayout()); // j'utilise un GridBagLayout pour la disposition des trois labels
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor=GridBagConstraints.CENTER; // on centre les jlabels
gbc.fill=GridBagConstraints.BOTH; // on demande au gridbaglayout que les jlabels s'étallent sur le maximum d'espace dans la grille (la taille du jlabel ne dépend plus du texte qu'il contient, mais de l'espace disponible, donné par la cellule de la JTable)
gbc.weightx=0.5f; // sur la première ligne, les deux composants vont se partager la largeur à 50/50
add(jlabel1,gbc);
gbc.gridx=1; // deuxième colonne de la première ligne
add(jlabel2,gbc);
gbc.gridx=0; // seconde ligne maintenant
gbc.gridwidth=2; // le jlabel de la seconde ligne s'étale sur les deux colonnes
gbc.gridy=1; // deuxième ligne
gbc.weightx=1f; // on s'étale au maximum de la largeur
add(jlabel3,gbc);
}
private void decorate(JLabel jlabel, Border border) {
jlabel.setOpaque(true);
jlabel.setBackground(Color.WHITE);
jlabel.setBorder(border);
jlabel.setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// ici on affecte les bonnes valeurs
TroisValeurs valeurs = (TroisValeurs)value;
// je place les valeurs dans les bons labels
jlabel1.setText(String.valueOf(valeurs.getValeur1()));
jlabel2.setText(String.valueOf(valeurs.getValeur2()));
jlabel3.setText(String.valueOf(valeurs.getValeur3()));
// je demande à Swing d'appliquer les règles de layout automatiquement
doLayout();
return this;
}
}
public static class TroisValeurs {
private int valeur1, valeur2, valeur3;
public TroisValeurs(int valeur1, int valeur2, int valeur3) {
this.valeur1=valeur1;
this.valeur2=valeur2;
this.valeur3=valeur3;
}
public int getValeur1() {
return valeur1;
}
public int getValeur2() {
return valeur2;
}
public int getValeur3() {
return valeur3;
}
}
} |
Partager