JComboBox - Problema com setEditable

Boa noite,

Estou tentando criar um formulário que funciona da seguinte maneira: Formulário não editável, combobox não editável, formulário editável combobox normal. O problema é que se eu utilizar DefaultComboBoxModel não consigo recuperar os objetos que insiro nos combos, recupero somente Strings, e se utilizo ComboBoxModel customizado, o eclipse acusa o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.plaf.basic.BasicComboBoxEditor.setItem(BasicComboBoxEditor.java:81)
	at javax.swing.JComboBox.configureEditor(JComboBox.java:1403)
	at javax.swing.plaf.basic.BasicComboBoxUI.configureEditor(BasicComboBoxUI.java:788)
	at javax.swing.plaf.metal.MetalComboBoxUI.configureEditor(MetalComboBoxUI.java:312)
	at javax.swing.plaf.basic.BasicComboBoxUI.addEditor(BasicComboBoxUI.java:737)
	at javax.swing.plaf.basic.BasicComboBoxUI$Handler.propertyChange(BasicComboBoxUI.java:1688)
	at javax.swing.plaf.basic.BasicComboBoxUI$PropertyChangeHandler.propertyChange(BasicComboBoxUI.java:636)
	at javax.swing.plaf.metal.MetalComboBoxUI$MetalPropertyChangeListener.propertyChange(MetalComboBoxUI.java:207)
	at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:303)
	at java.awt.Component.firePropertyChange(Component.java:8401)
	at javax.swing.JComponent.firePropertyChange(JComponent.java:4494)
	at javax.swing.JComboBox.setEditable(JComboBox.java:403)
	at forms.FrmAnotacoes.alteraCombo(FrmAnotacoes.java:301)
	at forms.FrmAnotacoes.alteraAssunto(FrmAnotacoes.java:306)
	at control.CrtAnotacoes.addAssunto(CrtAnotacoes.java:79)
	at control.CrtAnotacoes.actionPerformed(CrtAnotacoes.java:29)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6504)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6269)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4860)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Aqui vai o código do formulário:


package forms;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableRowSorter;

import model.CasosDeUsoRapidoModel;
import modelTabelas.TblCasoDeUsoRapidoModel;
import templates.BotoesPadrao;
import templates.CampoData;
import templates.CampoNumeroInt;
import ui.util.layouts.ParagraphLayout;
import validadores.ValidaTextField;
import control.CrtCasosDeUsoRapido;
import dao.CasoDeUso;
import dao.Projeto;

public class FrmCasosDeUsoRapido extends JDialog implements Observer{

	private JLabel lNome, lObjetivo, lOrdem, lDataConclusao;
	private CampoData tfDataConclusao;
	private JTextField tfNome;
	private CampoNumeroInt tfOrdem;
	private JTextArea taObjetivo;
	private JScrollPane spObjetivo, spTabela;
	private JTable tbTabela;
	private JPanel pPrincipal, pTabela;
	private BotoesPadrao pBotoes;
	private CrtCasosDeUsoRapido control;
	private CasosDeUsoRapidoModel model;
	private TblCasoDeUsoRapidoModel modelTabela;
	private TableRowSorter<TblCasoDeUsoRapidoModel> sorter;

	public FrmCasosDeUsoRapido(JFrame tela){
		super(tela);
		model = new CasosDeUsoRapidoModel();
		control = new CrtCasosDeUsoRapido(model, this);
		setTitle("- - C a s o s  D e  U s o - -");
		getContentPane().setLayout(new BorderLayout());

		pPrincipal();
		pBotoes();
		pTabela();
		alteraTela();

		setSize(new Dimension(750, 360));
		setModal(true);
		setVisible(true);
		
//		System.out.println("Size da tabela:\t" + tbTabela.getSize());

	}

	/**
	 * Para se evocar este método é necessário antecipadamente realizar o carregamento dos casos de uso no projeto
	 * @param p - Projeto
	 */
	public FrmCasosDeUsoRapido(JFrame tela, Projeto p){
		super(tela);
		model = new CasosDeUsoRapidoModel();
		control = new CrtCasosDeUsoRapido(model, this);
		model.setProjeto(p);
		
		setTitle("- - C a s o s  D e  U s o - -");
		getContentPane().setLayout(new BorderLayout());

		pPrincipal();
		pBotoes();
		pTabela();
		alteraTela();

		setSize(new Dimension(750, 360));
		setModal(true);
		setVisible(true);
//		pack();

	}


	public void alteraTela(){
		alteraTela((JPanel)getContentPane());
		pBotoes.habilitar();
	}

	private void alteraTela(JPanel p){
		for(Component c : p.getComponents()){
			if(!(c instanceof JPanel)){
				habilitaComponente(c);	
			}else{
				alteraTela((JPanel)c);
			}

		}
	}

	private void habilitaComponente(Component c){
		if (c instanceof JTextField){
			((JTextField)c).setEditable(!((JTextField)c).isEditable());
		}
		else if (c instanceof JTextArea){
			((JTextArea)c).setEditable(!((JTextArea)c).isEditable());
		}
		else if (c instanceof  JScrollPane){
			habilitaComponente(((JScrollPane)c).getViewport().getComponents()[0]);
		}
	}


	private void pPrincipal(){
		lNome = new JLabel("Nome: ");
		lObjetivo = new JLabel("Objetivo: ");
		lOrdem = new JLabel("Ordem: ");
		lDataConclusao = new JLabel("Conclusão: ");

		tfDataConclusao = new CampoData(CampoData.CURTA);

		tfNome = new JTextField(25);
		tfNome.setDocument(new ValidaTextField(30));

		tfOrdem = new CampoNumeroInt(5);

		taObjetivo = new JTextArea(5, 51);
		taObjetivo.setDocument(new ValidaTextField(300));
		taObjetivo.setLineWrap(true);

		spObjetivo = new JScrollPane(taObjetivo);

		pPrincipal = new JPanel(new ParagraphLayout());
		pPrincipal.setBorder(BorderFactory.createTitledBorder("Casos de Uso"));

		pPrincipal.add(lOrdem);
		pPrincipal.add(tfOrdem);
		pPrincipal.add(Box.createHorizontalStrut(10));
		pPrincipal.add(lNome);
		pPrincipal.add(tfNome);
		pPrincipal.add(Box.createHorizontalStrut(8));
		pPrincipal.add(lDataConclusao);
		pPrincipal.add(tfDataConclusao);
		pPrincipal.add(lObjetivo, ParagraphLayout.NEW_PARAGRAPH);
		pPrincipal.add(spObjetivo);

		getContentPane().add("Center", pPrincipal);

	}

	private void pBotoes(){
		pBotoes = new BotoesPadrao(control, BotoesPadrao.SOMENTE_FIGURA);
		pBotoes.removeProximo();
		pBotoes.removeAnterior();
		pBotoes.removeConsultar();
		pBotoes.setBorder(BorderFactory.createTitledBorder(""));
		pBotoes.setBackground(this.getBackground());
//		pBotoes.habilitar();
		getContentPane().add("South", pBotoes);
	}


	private void pTabela(){
		modelTabela = new TblCasoDeUsoRapidoModel();
		//		modelTabela.setCol(DAOFactory.getInstance().getCasoDeUsoDAO().getCol());

		sorter = new TableRowSorter<TblCasoDeUsoRapidoModel>(modelTabela);



		tbTabela = new JTable(modelTabela);
		tbTabela.setName("tbTabela");
		tbTabela.addMouseListener(control);

		tbTabela.setAutoCreateRowSorter(true);
		tbTabela.setRowSorter(sorter);
		tbTabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tbTabela.getSelectionModel().addListSelectionListener(
				new ListSelectionListener(){
					public void valueChanged(ListSelectionEvent arg0) {
						int viewRow = tbTabela.getSelectedRow();

						if(viewRow < 0){
							model.setCaso(new CasoDeUso());
						}else{
							model.setCaso(modelTabela.getRow(tbTabela.convertRowIndexToModel(viewRow)));
						}
					}

				}
		);


		spTabela = new JScrollPane(tbTabela);
		spTabela.setPreferredSize(new Dimension(600, 100));

		pTabela = new JPanel(new FlowLayout(FlowLayout.CENTER));
		pTabela.add(spTabela);
		tbTabela.getColumnModel().getColumn(0).setPreferredWidth(5);
		tbTabela.getColumnModel().getColumn(1).setPreferredWidth(150);
		tbTabela.getColumnModel().getColumn(2).setPreferredWidth(50);
		tbTabela.getColumnModel().getColumn(3).setPreferredWidth(40);


		getContentPane().add("North", pTabela);
	}


	public void update(Observable arg0, Object arg1) {
		CasosDeUsoRapidoModel model = (CasosDeUsoRapidoModel) arg0;
		if(model.getCodigo() != 0){
			tfNome.setText(model.getNome());
			tfOrdem.setText(String.valueOf(model.getOrdem()));
			taObjetivo.setText(model.getObjetivo());
			tfDataConclusao.setData(model.getDataConclusaoPrevista());
			modelTabela.setCol(model.getQtdCasos());
		}else{
			tfNome.setText("");
			tfOrdem.setText("");
			taObjetivo.setText("");
			tfDataConclusao.setText("");
			modelTabela.removeCol();
		}
	}


	public String getNome(){
		return tfNome.getText();
	}
	
	public String getObjetivo(){
		return taObjetivo.getText();
	}
	
	public Date getDataConclusaoPrevista(){
		return tfDataConclusao.getDate();
	}
	
	public int getOrdem(){
		return tfOrdem.getNum();
	}
	
	public void objetivoFoco(){
		taObjetivo.requestFocus();
	}
	public void nomeFoco(){
		tfNome.requestFocus();
	}
	public void ordemFoco(){
		tfOrdem.requestFocus();
	}
	public void dataFoco(){
		tfDataConclusao.requestFocus();
	}

}

O código da classe de controle:

package control;


import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import model.AnotacoesModel;
import dao.Assunto;
import dao.Topico;
import forms.FrmAnotacoes;
public class CrtAnotacoes implements ActionListener{

	private AnotacoesModel model;
	private FrmAnotacoes tela;
	private boolean sinal = true;

	public CrtAnotacoes(FrmAnotacoes tela,AnotacoesModel model){
		this.tela = tela;
		this.model = model;
	}

	public void actionPerformed(ActionEvent arg0){
		Component comp = (Component)arg0.getSource();

		if(comp.getName().equalsIgnoreCase("b_AddAssunto")){
			addAssunto();
		}else if(comp.getName().equalsIgnoreCase("b_SalvarAssunto")){
			salvaAssunto();
		}else if(comp.getName().equalsIgnoreCase("b_CancelarAssunto")){
			addAssunto();
		}else if(comp.getName().equalsIgnoreCase("b_RemoveAssunto")){
			removeAssunto();
		}else if(comp.getName().equalsIgnoreCase("b_AddTopico")){
			addTopico();
		}else if(comp.getName().equalsIgnoreCase("b_CancelarTopico")){
			addTopico();
		}else if(comp.getName().equalsIgnoreCase("b_RemoveTopico")){
			removeTopico();
		}else if(comp.getName().equalsIgnoreCase("b_SalvarTopico")){
			salvarTopico();
		}else if(comp.getName().equalsIgnoreCase("b_AddAnotacao")){
			addAnotacao();
		}else if(comp.getName().equalsIgnoreCase("b_Alterar")){

		}else if(comp.getName().equalsIgnoreCase("cb_assunto")){
			carregaTopicos();
		}
	}
	
	private void removeTopico(){
		if(tela.isTopico()){
			if((JOptionPane.showConfirmDialog(tela, "Deseja realmente excluir o tópico e todas as anotações deste? ", "",
					JOptionPane.YES_NO_OPTION)) == 0){
				tela.removeAssunto();
			}	
		}else{
			JOptionPane.showMessageDialog(tela, "Não há nenhum tópico para exclusão", "ERRO!!!",
					JOptionPane.ERROR_MESSAGE);
		}
		
	}
	
	private void salvarTopico(){
		Topico t = new Topico();
		t.setCodigo(tela.sizeTopico()+1);
		t.setNome(tela.getTopico());
		tela.addTopico(t);
		tela.alteraTopico();
	}
	
	private void carregaTopicos(){
		tela.carregaTopicos();
	}

	private void addAssunto(){
		tela.alteraAssunto();
	}
	
	private void salvaAssunto(){
		Assunto a = new Assunto();
		a.setCodigo(tela.sizeAssunto()+1);
		a.setNome(tela.getAssunto());
		tela.addAssunto(a);
		tela.alteraAssunto();
	}
	
	private void removeAssunto(){
		if((JOptionPane.showConfirmDialog(tela, "Deseja realmente excluir o assunto e todos os tópicos e anotações deste? ", "",
				JOptionPane.YES_NO_OPTION)) == 0){
			tela.removeAssunto();
		}
	}

	private void addAnotacao(){
		if(tela.isTopico()){
		tela.alteraAnotacao();
		}else{
			JOptionPane.showMessageDialog(tela, 
					"Primeiro adicione um tópico referente a esta anotação!!!", "ERRO!!!", 
					JOptionPane.ERROR_MESSAGE);
		}
	}

	private void addTopico(){
		if(tela.isAssunto()){
			tela.alteraTopico();
		}else{
			JOptionPane.showMessageDialog(tela, 
					"Primeiro adicione um assunto referente a este tópico!!!", "ERRO!!!", 
					JOptionPane.ERROR_MESSAGE);
		}
		
		
	}
	
	
}

E um dos combosModel

package model;

import java.util.ArrayList;
import java.util.List;

import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataListener;

import dao.Anotacao;
import dao.Assunto;

public class ComboAssuntoModel implements ComboBoxModel{

	private List<Assunto> col = new ArrayList<Assunto>();
	private Assunto assunto = new Assunto();


	public ComboAssuntoModel(){
		col = new ArrayList<Assunto>();
	}

	public Assunto getSelectedItem(){
		return assunto;
	}

	public void setSelectedItem(int i){
		if(col.size()>0){
			assunto = col.get(i);}
	}

	public void addListDataListener(ListDataListener arg0) {

	}

	public void removeListDataListener(ListDataListener arg0) {

	}
	
	public void removeElementAt(int i){
		col.remove(i);
	}

	public Assunto getElementAt(int i){
		return col.get(i);
	}

	public int getSize(){
		return col.size();
	}

	public void setSelectedItem(Object arg0) {
		assunto = (Assunto)arg0; 
	} 
	
	public void addElement(Assunto a){
		col.add(a);
//		fireIntervalAdded(this,col.size()-1, col.size()-1);
	}


}

Agradeço a quem puder ajudar.