Jtable Custom Cell Renderer et Editor problème de focus
Bonjour
J'ai créé un renderer et une editor qui contiennent un JPanel avec une checkbox et une combobox.
Mon problème est que il faut que je clique une fois sur la cellule ou la ligne pour la sélectionner et une fois de plus pour pouvoir sélectionner ou non la checkbox/combobox.
Je n'arrive pas a trouver comment faire pour que l'utilisateur puisse directement sélectionner la checkbox/combobox (Quand je passe la souris sur les composants le rollover n'est pas activé).
Le renderer:
Code:
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
| class PanelRenderer extends JPanel implements TableCellRenderer {
private JCheckBox check = new JCheckBox();
private JComboBox combo = new JComboBox();
public PanelRenderer() {
super();
init();
}
private void init() {
setLayout(new FlowLayout(FlowLayout.LEFT, 5, 10));
add(check);
add(combo);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof CustomItem) {
this.check.setSelected(((CustomItem) value).isSeleted());
this.combo.setSelectedItem(((CustomItem) value).getValue());
}
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(UIManager.getColor("Button.background"));
}
if(isSelected==false)
if(row % 2==0){
this.setBackground(new Color(198, 217, 241));
this.check.setBackground(new Color(198, 217, 241));
}
else{
this.setBackground(new Color(238, 236, 225));
this.check.setBackground(new Color(238, 236, 225));
}
return this;
}
} |
l'editor:
Code:
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
| class PanelEditor extends AbstractCellEditor implements TableCellEditor {
protected JPanel panel;
protected JCheckBox check;
private CustomItem customItem;
protected JComboBox combo;
private JTable table;
private int row;
private int column;
public PanelEditor() {
super();
panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 10));
check = new JCheckBox();
check.setOpaque(true);
check.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String comboValue = "";
if (combo.getItemCount() != 0)
comboValue = (String) combo.getSelectedItem();
// customItem.setSeleted(check.isSelected(), row);
// customItem.setValue(comboValue, row);
customItem.setSeleted(check.isSelected());
customItem.setValue(comboValue);
table.getModel().setValueAt(customItem, row, column);
// fireEditingStopped();
// getCellEditorValue();
}
});
}
}).start();
}
});
combo = new JComboBox();
combo.setOpaque(true);
combo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent event) {
if (event.getStateChange() == ItemEvent.SELECTED) {
Object item = event.getItem();
customItem.setSeleted(check.isSelected());
customItem.setValue(item.toString());
table.getModel().setValueAt(customItem, row, column);
}
}
});
panel.add(check);
panel.add(combo);
}
public void setComboxBoxData(String[] data) {
this.combo.removeAllItems();
this.combo.setModel(new DefaultComboBoxModel(data));
this.combo.setSelectedIndex(0);
}
public void setComboxBoxData(Vector<String> liftModel) {
this.combo.removeAllItems();
this.combo.setModel(new DefaultComboBoxModel(liftModel));
this.combo.setSelectedIndex(0);
}
@Override
public Object getCellEditorValue() {
return customItem;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.table = table;
this.customItem = (CustomItem) value;
this.row = row;
this.column = column;
this.check.setSelected(customItem.isSeleted());
this.combo.setSelectedItem(customItem.getValue());
if (isSelected) {
check.setForeground(table.getSelectionForeground());
check.setBackground(table.getSelectionBackground());
} else {
check.setForeground(table.getForeground());
check.setBackground(table.getBackground());
}
if(isSelected==false)
if(row % 2==0){
this.panel.setBackground(new Color(198, 217, 241));
this.check.setBackground(new Color(198, 217, 241));
}
else{
this.panel.setBackground(new Color(238, 236, 225));
this.check.setBackground(new Color(238, 236, 225));
}
return panel;
}
} |