Problemas com herança{resolvido com composição]

12 respostas
A

Olá pessoal, tenho um jInternalFrame com alguns botões, quando construo um outro jInternalFrame e estendo do primeiro, ele executa sem problemas.
porem quando eu coloca icones(imagens) nos botões da classe pai, ae executar a classe filho ocorre o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
	at jinternalframes.cadastros.JIFModeloCadastros.initComponents(JIFModeloCadastros.java:56)
	at jinternalframes.cadastros.JIFModeloCadastros.<init>(JIFModeloCadastros.java:23)
	at jinternalframes.cadastros.JIFCUsuarios.<init>(JIFCUsuarios.java:20)
	at jframes.JFPrincipal.jMIUsuariosActionPerformed(JFPrincipal.java:175)
	at jframes.JFPrincipal.access$100(JFPrincipal.java:25)
	at jframes.JFPrincipal$3.actionPerformed(JFPrincipal.java:139)
	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.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
	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)

alguem sabe o que pode estar acontecendo? não posso herdar botões com icones?? ;/

12 Respostas

Polverini

pelo visto ele nao encontra a imagem, posta o codigo de onde vc seta a imagem

A

eu seto a imagem pela ferramenta netbeans. e o internalframe pai esta no mesmo pacote do jinternalframe filho. e as imagens estão dentro deste pacote.

e achei estrnho pq agora tirei as imagens, e ele abre o internalframe filho sem os botões que existem no jinternalframe pai!

se faço isso com jframes ao inves de jinternalframes, ele mostra os botões na classe filho.

mauricioadl

a classe pai tem mais de um construtor? pode ser que algo esta diferente neles.

pode ser tbm o modo como vc chama as suas imagens, ta usando o getResourceAsStream ou getResource?

Polverini

posta o codigo fonte

A
vou postar todo o codigo, mas eh grande pq fiz pelo netbeans tenho a classe pai:
package jinternalframes.cadastros;



/**
 *
 * @author BCN
 */
public class JIFModeloCadastros extends javax.swing.JInternalFrame {

    /** Creates new form NewJInternalFrame */
    public JIFModeloCadastros() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jBRetornar = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();

        jBRetornar.setBackground(new java.awt.Color(86, 183, 248));
        jBRetornar.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jBRetornar.setText("Retornar");
        jBRetornar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBRetornarActionPerformed(evt);
            }
        });
        jBRetornar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jBRetornarKeyPressed(evt);
            }
        });

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jinternalframes/cadastros/imagemBotaoAtualizarRegistro.png"))); // NOI18N
        jButton1.setText("Atualizar Registro");
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jinternalframes/cadastros/imagemBotaoApagarRegistro.png"))); // NOI18N
        jButton2.setText("Apagar Registro");
        jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jinternalframes/cadastros/imagemBotaoSlavarRegistro.png"))); // NOI18N
        jButton3.setText("Salvar Registro");
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        jButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jinternalframes/cadastros/imagemBotaoCancelar.png"))); // NOI18N
        jButton4.setText("Cancelar");
        jButton4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        jButton5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jinternalframes/cadastros/imagemBotaoNovoRegistro.png"))); // NOI18N
        jButton5.setText("Novo Registro");
        jButton5.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton5.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jBRetornar, javax.swing.GroupLayout.PREFERRED_SIZE, 486, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jButton5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jBRetornar, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton4)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>


    // Variables declaration - do not modify
    private javax.swing.JButton jBRetornar;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    // End of variables declaration
}

essa classe pai é um internalframe que eu criei com alguns botões (botões que vou usar em varios outros jinternalframe)

ae na classe filho (tb um jinternalframe)
package jinternalframes.cadastros;

/**
 *
 * @author BCN
 */
public class JIFCUsuarios extends JIFModeloCadastros {

    /** Creates new form JIFCUsuarios */
    public JIFCUsuarios() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setTitle("Cadastro de Usuários");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 769, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 475, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>
    // Variables declaration - do not modify
    // End of variables declaration
}

ae com isso ele ocorre o erro que postei acima.
porem se eu tiro as imagens dos botões, a classe filho executa mas nao mostra os botões Oo

mauricioadl

como eu disse, esta usando o getResource ele aponta exatamente para a classe que o chama. por isso da erro nas imagens.

dois modos para resolver
1º aponte as imagens para o diretorio da aplicacao

2º cria um componente de botoes e use composicao ao inves de herança

eu acho a 2ª opção mais correta!

[]'s

A

mauricioadl
arrumei como voce falou o caminho das imagens, e nao da erro, porem nao aparece os botões, tipo, ele abre o internal frame porem sem nenhum botao dentro (nao era pra aparecer o botões que estão na classe pai?)

pode me dar um exemplo da 2ª sugestão, nao sei o q é composição ao inves de herança ;/

mauricioadl

composicao seria algo do tipo:

class MeuBotoes {
 // aqui vc desenvolve um painel, menu, qlqer coisa que monte botoes. 
// eu normalmente crio uma classe e estendo de JToolBar, fica muito bom
}

class MeuFrame extends JFrame ou JInternalFrame ou Etc e tal {
// aqui em vez de herdar a classe que tem os botoes, eu usei ela pra compor a minha classe
MeusBotoes mb = new MeusBotoes();
add(mb);
}

sei q o exemplo ficou tosco, mas acho q vc entende de boa

abração

A

vou tentar aqui e posto o resultado, muito obrigado!

A

soh uma duvida, a classe meusBotões pode ser um jinternalframe? para mim poder visualizar os botões no netbeans?

mauricioadl
augusto340:
soh uma duvida, a classe meusBotões pode ser um jinternalframe? para mim poder visualizar os botões no netbeans?

ficaria gambiarra, crie um jtoolbar q fica melhor. segue um exemplo bacana.

public class CrudToolBar extends JToolBar implements ActionListener {
	private JButton btnSalvar;
	private JButton btnExcluir;
	private JButton btnLocalizar;
	private JButton btnFechar;
	private JButton btnImprimir;
	private ICrud crud;
	
	public CrudToolBar(ICrud crud) {
		this.crud = crud;
		btnSalvar = new JButton(new ImageIcon("icones/salvar.png"));
		btnSalvar.setText("Salvar");
		btnExcluir = new JButton(new ImageIcon("icones/delete.png"));
		btnExcluir.setText("Excluir");
		btnLocalizar = new JButton(new ImageIcon("icones/localizar.png"));
		btnLocalizar.setText("Localizar");
		btnFechar = new JButton(new ImageIcon("icones/sair.png"));
		btnFechar.setText("Fechar");
		btnImprimir = new JButton(new ImageIcon("icones/imprimir.png"));
		btnImprimir.setText("Imprimir");
		
		add(btnSalvar);
		add(btnExcluir);
		add(btnLocalizar);
		add(btnImprimir);
		add(btnFechar);
		
		setRollover(false);
		setFloatable(false);
	}
	
	@Override
	public Component add(Component component) {
		if (component instanceof AbstractButton) {
			((AbstractButton) component).addActionListener(CrudToolBar.this);
			((AbstractButton) component).setFocusable(false);
			((AbstractButton) component).setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
			((AbstractButton) component).setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
			((AbstractButton) component).setPreferredSize(new Dimension(150, 70));
			((AbstractButton) component).setMaximumSize(new Dimension(150, 70));
		}
		return super.add(component);
	}

	@Override
	public void actionPerformed(ActionEvent arg) {
		if(arg.getSource() == btnSalvar){
			crud.salvar();
		} else if(arg.getSource() == btnExcluir){
			crud.excluir();
		} else if(arg.getSource() == btnLocalizar){
			crud.localizar();
		} else if(arg.getSource() == btnImprimir){
			crud.imprimir();
		} else if(arg.getSource() == btnFechar){
			crud.fechar();
		}
	}
public interface ICrud {
	public void salvar();

	public void excluir();

	public void localizar();

	public void fechar();

	public void imprimir();
}
A

Por isso eu adoro esse forum!
mauricioadl muito obrigado, consegui fazer! :wink:

Criado 8 de março de 2012
Ultima resposta 8 de mar. de 2012
Respostas 12
Participantes 3