Salve a tutti.
Innanzitutto, spero di non aver violato qualche regola creando questo topic (non ne ho visti di analoghi in giro per il forum e nel topic Pillole eccetera non c'era nulla che potesse risolvere), nè con il nome (non sapevo come metterlo senza farlo lungo 3km).
Detto questo, espongo il mio problema.
Ho un programma Java in cui creo una tabella utilizzando una classe creata ad hoc che estende JTable (questo solo per poter avere più flessibilità sulla visualizzazione dei componenti, ma non cambia nulla riguardo al mio problema rispetto a una JTable vera e propria). In questa tabella inserisco dati di vario tipo (scritte, JButton e JComboBox) e fino alla visualizzazione non c'è problema. Il problema sorge con i listener. Quando cambio il valore di una combo box, graficamente viene cambiato, ma il componente vede sempre come selezionato il vecchio valore. Per cui ho creato un listener dove poter gestire l'evento. Ma quando cambio il valore della combo box, il listener non viene mai eseguito.
Le uniche soluzioni che ho trovato cercando in giro per il web consigliavano di aggiungere un ActionListener o un ItemListener alla combo box quando viene creato l'editor. Qualcuno ha qualche idea del perchè non venga eseguito il listener? Posto il codice.
Editor della combo box:
listener:Codice PHP:public class MyComboBoxEditor extends DefaultCellEditor{
public MyComboBoxEditor(JTableX _tabellaDiAppartenenza) {
super(new JComboBox());
(JComboBox)super.editorComponent).addItemListener(new MyItemListener((JComboBox)super.editorComponent));
}
public Component getTableCellEditorComponent(JTable arg0, Object arg1, boolean arg2, int arg3, int arg4) {
String elementi[]=new String[((JComboBox)arg1).getItemCount()];
for(int i=0;i<((JComboBox)arg1).getItemCount();i++){
elementi[i]=(String)((JComboBox)arg1).getItemAt(i);
}
super.editorComponent=new JComboBox(elementi);
return super.getTableCellEditorComponent(arg0, arg1, arg2, arg3, arg4);
}
}
tabella:Codice PHP:public class MyItemListener implements ItemListener{
private JComboBox combo;
public MyItemListener(JComboBox object){
combo=object;
}
public void itemStateChanged(ItemEvent arg0) {
int changeEvent = arg0.getStateChange();
if(changeEvent==ItemEvent.SELECTED){
Object value=arg0.getItem();
combo.setSelectedItem(value);
}
}
}
scusatemi per la lunghezza del messaggio, spero che qualcuno possa risolvere il problema. Grazie in anticipo. Spero di aver postato tutto il codice di cui c'è bisogno per capire l'errore.Codice PHP:public class JTableX extends JTable{
protected MyCellEditorModel myCellEditorModel;
public JTableX(MyDataModel tm){
super(tm);
Object ge = defaultEditorsByColumnClass.get(Boolean.class);
DefaultCellEditor dce = (DefaultCellEditor)ge;
dce.setClickCountToStart(0);
MyButtonEditor mbe = new MyButtonEditor(new JCheckBox("Bottone"), this);
mbe.setClickCountToStart(0);
MyComboBoxEditor mcbe = new MyComboBoxEditor(this);
mcbe.setClickCountToStart(0);
defaultEditorsByColumnClass.clear();
Hashtable cellEditors = new Hashtable();
cellEditors.put(JButton.class, mbe);
cellEditors.put(JComboBox.class, mcbe);
cellEditors.put(Boolean.class, dce);
this.defaultRenderersByColumnClass.put(JButton.class, new MyButtonRenderer());
this.defaultRenderersByColumnClass.put(JComboBox.class, new MyComboBoxRenderer());
defaultEditorsByColumnClass.put(Object.class, new MyCellEditorModel1(cellEditors));
}
public TableCellEditor getCellEditor(int row, int col){
if(myCellEditorModel!=null) return myCellEditorModel;
return super.getCellEditor(row,col);
}
public TableCellRenderer getCellRenderer(int row, int column) {
Object value = getValueAt(row,column);
if (value !=null) {
return getDefaultRenderer(value.getClass());
}
return super.getCellRenderer(row,column);
}
public void setCellEditor(MyCellEditorModel anEditor) {
myCellEditorModel = anEditor;
}
}
Ciao a tutti.

Rispondi quotando