Cours interface graphique en Java les éditeurs, tutoriel & guide de travaux pratiques JAVA en pdf.
Le FileTableModel
● on crée une table à trois colonnes:
public class FileTableModel extends AbstractTableModel {
private File[] files;
private static String[] columnNames=new String[]{« Name », »Date », »Size »};
public FileTableModel(File directory) {
if (directory==null || !directory.isDirectory()) {
throw new IllegalArgumentException(« FileTableModel requires a directory »);
}
files=directory.listFiles();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return files.length;
}
…
}
public class FileTableModel extends AbstractTableModel { …
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) { File f=files[rowIndex];
switch (columnIndex) {
case 0: return f.getName();
case 1: return new Date(f.lastModified());
case 2: return f.length();
default: throw new IllegalArgumentException(
« Invalid column index: « +columnIndex);
}
}
}
Redimensionner les colonnes
● 5 modes possibles à définir avec setAutoResizeMode:
Déplacer les colonnes
● le TableColumnModel gère une indirection entre la position des colonnes dans le modèle et celle dans la vue:
private static Component createFileTable3() {
final JTable t=new JTable(4,3);
t.getColumnModel().addColumnModelListener(
new TableColumnModelListener() {
@Override public void columnAdded(TableColumnModelEvent e) {
updateHeaders();
… }
private void updateHeaders() {
for (int i=0;i<t.getColumnCount();i++) {
int viewIndex=t.convertColumnIndexToView(i);
if (viewIndex==-1) continue;
TableColumn column=t.getColumnModel().getColumn(viewIndex);
column.setHeaderValue(t.getColumnName(viewIndex)
} + » [model index= »+i+ », view index= »+viewIndex+ »] »);
}
… });
}
● on peut ainsi savoir où sont les colonnes dans le modèle:
…
JPanel p=new JPanel(new BorderLayout());
JCheckBox check=new JCheckBox(« Column reordering allowed »,true);
check.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
t.getTableHeader().setReorderingAllowed(((JCheckBox)e.getSource()).isSelected());
}});
p.add(check,BorderLayout.NORTH);
p.add(new JScrollPane(t));
return p;
} 2
p
TableColumn
● plus généralement, le TableColumnModel gère des TableColumn contenant:
– l’index correspondant dans le modèle
– une largeur
– un éditeur
– un renderer
TableColumn(int modelIndex,
int width,
TableCellRenderer cellRenderer,
TableCellEditor cellEditor)
Les renderers
● on peut définir le renderer soit par colonne:
– tableColumn.setCellRenderer(TableCellR enderer renderer)
● soit par type d’objet:
– table.setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)
● dans ce dernier cas, Swing utilise getColumnClass pour savoir quel
renderer appeler
● exemple: renderer qui affiche une image
@SuppressWarnings(« serial »)
private static Component createFileTable4() {
final JTable t = new JTable(new AdvancedFileTableModel(
new File(« ./src/fr/umlv/ig/example_viewer »)));
t.setDefaultRenderer(ImageIcon.class, new DefaultTableCellRenderer() {
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
ImageIcon icon = (ImageIcon) value; null, isSelected, hasFocus, row, column);
super.getTableCellRendererComponent(table,
setHorizontalAlignment(SwingConstants.CENTER);
if (icon != null) {
setIcon(icon);
final int r = row;
final int h = icon.getIconHeight();
if (t.getRowHeight(r) < h) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
t.setRowHeight(r, h);
}); }
}
} si nécessaire, on adapte la hauteur
return this;
} de la ligne à celle de l’image
return new JScrollPane(t);
});
}
Les éditeurs
● pour éditer et modifier une cellule, il faut:
– que la cellule soit déclarée éditable: boolean isCellEditable(int rowIndex, int columnIndex)
– qu’on puisse modifier les données: void setValueAt(Object value, int rowIndex, int columnIndex)
– qu’il y ait un éditeur installé (c’est le cas par défaut)
● exemple: édition de valeurs booléennes
renderer/éditeur par défaut pour les Boolean
● on peut utiliser 3 sortes d’éditeurs prédéfinis:
– DefaultCellEditor(JCheckBox checkBox)
– DefaultCellEditor(JComboBox comboBox)
– DefaultCellEditor(JTextField textField)
JTable t=new JTable(model); t.setDefaultEditor(Boolean.class,
new DefaultCellEditor(
new JComboBox(
new Boolean[]{true,false})));
………