Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Dynamic JComboBox in JTable

Chris JonesMay 7 2011 — edited May 12 2011
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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 9 2011
Added on May 7 2011
5 comments
1,417 views