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.