Bonjour tout le monde,
Je suis confronté à un petit problème. Je souhaite intégrer des JComboBox dans une JTable. Attention tous les combo seront renseigné avec des items différents. De plus, la table intégre des textbox selon le type de donné passé au renderer.
Pour cela j'ai donc créé un renderer et un éditeur. Les combo marchent trés bien, mais le seul soucis provient du fait que lorsque que j'édite une combo la valeur éditer ne reste pas comme selected item.
Il faut que je rentre plus dans les détails. J'ai un objet ModelData qui est injecté dans le model de ma JTable ce qui me permet selon la définition de l'objet d'afficher un renderer et un editeur différent. Mon objet ModelData peut être soit de type combo ou de type text. Il stocke l'objet courant (pour les combo principalement) et contient donc un tableau de String.
Voici mon editeur:
public class JComboBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
JComboBox combo;
JTextField textArea;
ModelData data;
public JComboBoxCellEditor() {
combo = new JComboBox();
textArea = new JTextField("");
data = null;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
System.out.println("JComboBoxCellEditor ******* getTableCellEditorComponent ==>> selectedItem{"+((ModelData)value).getSelectedItem()+"}" );
data = (ModelData)value;
if( data.getType() == ModelData.COMBO ){
combo.removeAllItems();
for(String item: data.getItems())
combo.addItem(item);
//data.setSelectedItem(combo.getSelectedItem().toString());
combo.setEditable(true);
return combo;
}else{
textArea.setText(data.getSelectedItem());
//data.setSelectedItem(textArea.getText());
return textArea;
}
}
public Object getCellEditorValue() {
System.out.println("JComboBoxCellEditor ******* getCellEditorValue ==>> selectedItem{"+data.getSelectedItem()+"}" );
if( data.getType() == ModelData.COMBO ){
String tmp = combo.getSelectedItem().toString();
data.addItem(tmp);
data.setSelectedItem(tmp);
return data;
}else{
String tmp = textArea.getText();
data.addItem(tmp);
data.setSelectedItem(tmp);
return data;
}
}
}
Voici mon renderer:
public class JComboBoxTableCellRenderer implements TableCellRenderer {
JComboBox combo;
JLabel textArea;
public JComboBoxTableCellRenderer( ) {
combo = new JComboBox();
textArea = new JLabel();
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
//System.out.println("JComboBoxTableCellRenderer ******* getTableCellRendererComponent ==>> selectedItem{"+((ModelData)value).getSelectedItem()+"}" );
ModelData data = (ModelData)value;
if( data.getSelectedItem().contains("ERROR") ){
JLabel errorLabel = new JLabel( data.getSelectedItem() );
errorLabel.setForeground(Color.RED);
return errorLabel;
}
if( data.getType() == data.COMBO ){
for (String item : data.getItems()) {
combo.addItem( item );
}
combo.setEditable(true);
//combo.setSelectedItem( data.getSelectedItem() );
return combo;
}else{
textArea.setText(data.getSelectedItem());
return textArea;
}
}
}
Le principe c'est de pouvoir avoir des combo box et des text field dans la même JTable. Cependant lorsque l'on edite un textfield le champ édité et alors ajouté au ModelData associé à la textfield et elle devient un combo box.
Le seul probléme est que je n'arrive pas à stocker la derbiére valeur éditée.
Please help, je pense que ça doit être tout con mais la même le debug c'est tendu !!!