Filtrando o JComboBox

Olá.
Alguém poderia me ensinar a fazer um filtro num JComboBox como o código a seguir, só que ele filtra a JTable.
Quero ter um JComboBox que filtre os valores dele enquanto eu for escrevendo os caracteres.
E outra coisa, como eu faço pra adicionar esse JComboBox em uma JTable.

[code]import javax.swing.;
import javax.swing.event.
;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;
import java.awt.Dimension;
import java.awt.Component;

public class TableFilterDemo extends JPanel {
private boolean DEBUG = false;
private JTable table;
private JTextField filterText;
private JTextField statusText;
private TableRowSorter<MyTableModel> sorter;

public TableFilterDemo() {
    super();
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    //Create a table with a sorter.
    MyTableModel model = new MyTableModel();
    sorter = new TableRowSorter&lt;MyTableModel&gt;(model);
    table = new JTable(model);
    table.setRowSorter(sorter);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    //For the purposes of this example, better to have a single
    //selection.
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    //When selection changes, provide user with row numbers for
    //both view and model.
    table.getSelectionModel().addListSelectionListener(
            new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent event) {
                    int viewRow = table.getSelectedRow();
                    if (viewRow &lt; 0) {
                        //Selection got filtered away.
                        statusText.setText(&quot;&quot;);
                    } else {
                        int modelRow = 
                            table.convertRowIndexToModel(viewRow);
                        statusText.setText(
                            String.format(&quot;Selected Row in view: %d. &quot; +
                                &quot;Selected Row in model: %d.&quot;, 
                                viewRow, modelRow));
                    }
                }
            }
    );


    //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);

    //Add the scroll pane to this panel.
    add(scrollPane);

    //Create a separate form for filterText and statusText
    JPanel form = new JPanel(new SpringLayout());
    JLabel l1 = new JLabel(&quot;Filter Text:&quot;, SwingConstants.TRAILING);
    form.add(l1);
    filterText = new JTextField();
    //Whenever filterText changes, invoke newFilter.
    filterText.getDocument().addDocumentListener(
            new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                    newFilter();
                }
                public void insertUpdate(DocumentEvent e) {
                    newFilter();
                }
                public void removeUpdate(DocumentEvent e) {
                    newFilter();
                }
            });
    l1.setLabelFor(filterText);
    form.add(filterText);
    JLabel l2 = new JLabel(&quot;Status:&quot;, SwingConstants.TRAILING);
    form.add(l2);
    statusText = new JTextField();
    l2.setLabelFor(statusText);
    form.add(statusText);
    SpringUtilities.makeCompactGrid(form, 2, 2, 6, 6, 6, 6);
    add(form);
}

/** 
 * Update the row filter regular expression from the expression in
 * the text box.
 */
private void newFilter() {
    RowFilter&lt;MyTableModel, Object&gt; rf = null;
    //If current expression doesn't parse, don't update.
    try {
        rf = RowFilter.regexFilter(filterText.getText(), 0);
    } catch (java.util.regex.PatternSyntaxException e) {
        return;
    }
    sorter.setRowFilter(rf);
}

class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {&quot;First Name&quot;,
                                    &quot;Last Name&quot;,
                                    &quot;Sport&quot;,
                                    &quot;# of Years&quot;,
                                    &quot;Vegetarian&quot;};
    private Object[][] data = {
    {&quot;Kathy&quot;, &quot;Smith&quot;,
     &quot;Snowboarding&quot;, new Integer(5), new Boolean(false)},
    {&quot;Kahn&quot;, &quot;Doe&quot;,
     &quot;Rowing&quot;, new Integer(3), new Boolean(true)},
    {&quot;Sue&quot;, &quot;Black&quot;,
     &quot;Knitting&quot;, new Integer(2), new Boolean(false)},
    {&quot;Jane&quot;, &quot;White&quot;,
     &quot;Speed reading&quot;, new Integer(20), new Boolean(true)},
    {&quot;Joe&quot;, &quot;Brown&quot;,
     &quot;Pool&quot;, new Integer(10), new Boolean(false)}
    };

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    /*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text (&quot;true&quot;/&quot;false&quot;),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col &lt; 2) {
            return false;
        } else {
            return true;
        }
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
    public void setValueAt(Object value, int row, int col) {
        if (DEBUG) {
            System.out.println(&quot;Setting value at &quot; + row + &quot;,&quot; + col
                               + &quot; to &quot; + value
                               + &quot; (an instance of &quot;
                               + value.getClass() + &quot;)&quot;);
        }

        data[row][col] = value;
        fireTableCellUpdated(row, col);

        if (DEBUG) {
            System.out.println(&quot;New value of data:&quot;);
            printDebugData();
        }
    }

    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();

        for (int i=0; i &lt; numRows; i++) {
            System.out.print(&quot;    row &quot; + i + &quot;:&quot;);
            for (int j=0; j &lt; numCols; j++) {
                System.out.print(&quot;  &quot; + data[i][j]);
            }
            System.out.println();
        }
        System.out.println(&quot;--------------------------&quot;);
    }
}

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame(&quot;TableFilterDemo&quot;);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    TableFilterDemo newContentPane = new TableFilterDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

}[/code]