djar | Bon pour tous ceux qui veulent faire un truc éditable, voici mon code, et j'ai luté pour comprendre comment ça fonctionnait
Je sais pas si c'est le meilleur code, mais je le donne quand même...
Code :
- import java.awt.Component;
- import java.awt.Insets;
- import java.awt.event.*;
- import javax.swing.JCheckBox;
- import javax.swing.AbstractCellEditor;
- import javax.swing.JOptionPane;
- import javax.swing.SwingConstants;
- import java.awt.Color;
- import javax.swing.JTable;
- import javax.swing.table.TableCellEditor;
- import javax.swing.table.TableCellRenderer;
- public class JCheckBoxCellEditorRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer, ItemListener {
- private static final long serialVersionUID = 1L;
- private JCheckBox _checkBox = null;
- private JTable _table;
- private int _currentRow, _currentCol;
- VideoClub _videoClub;
- public JCheckBoxCellEditorRenderer(VideoClub vc, JTable theTable) {
- _videoClub = vc;
- _table = theTable;
- }
- /**
- * Permet d'obtenir un composant interrupteur éditable avec un état de départ fixé
- */
- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
- _checkBox = new JCheckBox();
- _checkBox.setHorizontalAlignment(SwingConstants.LEFT);
- _checkBox.setBackground(Color.white);
- _checkBox.setMargin(new Insets(0,0,0,0));
- _currentRow = row;
- _currentCol = column;
- boolean bValue = ((Boolean) value).booleanValue();
- if ( bValue == false && ((FilmsTableModel)_table.getModel()).getCptSelection() >= _videoClub.getNbFilmsLouable()) {
- JOptionPane.showMessageDialog(_videoClub,"Erreur de sélection ! Impossible de choisir plus de " + _videoClub.MAX_LOCATION + " films à la fois !","Erreur", JOptionPane.ERROR_MESSAGE);
- return null;
- } else {
- // Fixer l'état de départ
- _checkBox.setSelected(bValue);
- _checkBox.addItemListener(this);
- return _checkBox;
- }
- }
- public Object getCellEditorValue() {
- return Boolean.valueOf(_checkBox.isSelected());
- }
- /**
- * Permet d'obtenir un composant interrupteur affichable avec un état de départ fixé
- */
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
- JCheckBox cb = new JCheckBox();
- cb.setSelected(((Boolean) value).booleanValue());
- return cb;
- }
- public void itemStateChanged(ItemEvent e) {
- if(e.getSource()instanceof JCheckBox) {
- FilmsTableModel model = ((FilmsTableModel)_table.getModel());
- model.setSelectionVal(Boolean.valueOf(!((Boolean)model.getValueAt(_currentRow, _currentCol)).booleanValue()), _currentRow);
- }
- }
- }
|
|