I want the JComboBox's in the JTable to update after the JComboBox's model is updated. I am firing events to alert the JComboBox but it does not seem to acknoledge the changes. Any suggestions?
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.MutableComboBoxModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
/**
*
* @author Chris
*/
class GUI {
private ComboBoxModel<Integer> model;
public void createGui() {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
model = new ComboBoxModel<Integer>(numbers);
String[] columnNames = {"ComboBoxes"};
Object[][] data = {{1}, {1}, {1}};
JTable table = new JTable(new DefaultTableModel(data, columnNames));
TableColumn col = table.getColumnModel().getColumn(0);
col.setCellRenderer(new MyComboBoxRenderer(model));
col.setCellEditor(new MyComboBoxEditor(model.toArray()));
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(table), BorderLayout.NORTH);
panel.add(getButtonPanel(), BorderLayout.SOUTH);
JFrame mainFrame = new JFrame("Example");
mainFrame.add(panel);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.pack();
mainFrame.setVisible(true);
}
private JPanel getButtonPanel() {
JButton addItemButton = new JButton("Add Item");
addItemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.addElement(model.getSize() + 1);
model.print();
}
});
JButton removeItemButton = new JButton("Remove item");
removeItemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.removeElement(model.getSize());
model.print();
}
});
JButton setItemButton = new JButton("set to 1");
setItemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.setSelectedItem(1);
model.print();
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(addItemButton);
buttonPanel.add(removeItemButton);
buttonPanel.add(setItemButton);
return buttonPanel;
}
public static void main(String[] args) {
new GUI().createGui();
}
}
class ComboBoxModel<E> extends AbstractListModel implements MutableComboBoxModel {
private Object selectedItem;
private ArrayList sections;
public ComboBoxModel(ArrayList<E> arrayList) {
sections = arrayList;
}
public Object getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(Object newValue) {
selectedItem = newValue;
int index = sections.indexOf(newValue);
fireContentsChanged(newValue, index, index);
}
public int getSize() {
return sections.size();
}
public Object getElementAt(int i) {
return sections.get(i);
}
public void setElementAt(Object newValue, int i) {
this.fireContentsChanged(newValue, i, i);
this.sections.set(i, newValue);
}
public void addElement(Object obj) {
sections.add(obj);
this.fireIntervalAdded(obj, this.getSize() - 1, this.getSize() - 1);
}
public void removeElement(Object obj) {
this.fireIntervalRemoved(obj, sections.indexOf(obj), sections.indexOf(obj));
sections.remove(obj);
}
public void insertElementAt(Object obj, int index) {
sections.add(index, obj);
this.fireIntervalAdded(obj, index, index);
}
public void removeElementAt(int index) {
this.fireIntervalRemoved(sections.get(index), index, index);
sections.remove(index);
}
public void print() {
System.out.println("\n\nPrinting List");
for (int i = 0; i < this.sections.size(); i++) {
System.out.println(this.sections.get(i));
}
System.out.println("The selected item is " + this.selectedItem);
}
public boolean contains(Object o) {
return sections.contains(o);
}
public final Object[] toArray() {
return this.sections.toArray();
}
}
class MyComboBoxEditor extends DefaultCellEditor {
public MyComboBoxEditor(Object[] items) {
super(new JComboBox(items));
}
}
class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
public MyComboBoxRenderer(Object[] items) {
super(items);
}
public MyComboBoxRenderer(ComboBoxModel cb) {
super(cb);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setSelectedItem(value);
return this;
}
}
Thanks