Salut,
On peut afficher n'importe quelle valeur dans une JTable : il suffit de la mettre dans la bonne colonne du modèle, avec le type adéquat. Ensuite, pour l'afficher il suffit de la formatter.
Par exemple, un pourcentage peut s'exprimer de différentes manières du point du vue type : un int par exemple, de 0 à 100. Mais aussi un double, de 0 à 1.
Ensuite pour formatter, tout dépend comment on veut l'afficher.
Par exemple, on peut faire :
1 2 3 4 5 6
| NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(1);
double value = 0.4266; // 57 %
System.out.println( percentFormat.format(value)); |
pour avoir comme résultat : Ou
1 2 3 4 5
| DecimalFormat percentFormat = new DecimalFormat("#0.##%");
double value = 0.4266; // 57 %
System.out.println( percentFormat.format(value)); |
pour avoir comme résultat : Pour mettre la valeur dans la JTable, et pouvoir les saisir (les éditer), il faut lui affecter un modèle (DefaultTableModel), en précisant que la colonne qui contient les pourcentages contient du Double (si le pourcentage est typé ainsi) : on peut procéder en rédéfinissant la méthode getColumnClass(int columnIndex).
Par exemple, s'il y a 2 colonnes de données, une première en String, et une seconde en Double :
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Override
public Class<?> getColumnClass(int columnIndex) {
Class<?> klass = Object.class;
switch(columnIndex) {
case 0:
klass = String.class;
break;
case 1:
klass = Double.class;
break;
}
return klass;
} |
Ensuite, il suffit d'affecter un TableCellRenderer qui formatte comme voulue la valeur, par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class PercentRenderer extends DefaultTableCellRenderer {
private final static NumberFormat PERCENT_FORMAT;
static {
NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(1);
PERCENT_FORMAT = percentFormat;
}
@Override
protected void setValue(Object value)
{
if ( value==null ) {
setText("");
}
else {
setText(PERCENT_FORMAT.format(value));
}
}
} |
Puis de l'associer à la classe, pour la JTable :
1 2
|
table.setDefaultRenderer(Double.class, new PercentRenderer()); |
Pour l'édition également il faut mettre en place un éditeur qui formatte et saisie en pourcentage, en utilisant également le même format (ou pas) : on utilise pour ça un TableCellEditor.
Par exemple :
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
| public class PercentCellEditor extends AbstractCellEditor implements TableCellEditor {
private final static NumberFormat PERCENT_FORMAT;
static {
NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(1);
PERCENT_FORMAT = percentFormat;
}
JComponent component = new JFormattedTextField(PERCENT_FORMAT);
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int rowIndex, int vColIndex) {
((JFormattedTextField) component).setValue(value);
return component;
}
public Object getCellEditorValue() {
return ((JFormattedTextField) component).getValue();
}
} |
Puis de l'associer au type, comme pour le TableCellRenderer :
table.setDefaultEditor(Double.class, new PercentCellEditor());
Partager