Destruir JInternalFrame - [RESOLVIDO]

16 respostas
C

Olá Pessoal, estou com um prob.
Tenho um JInternalFrame, é uma tela de cadastro, e assim que os dados são inseridos no bd, eu quero encerrar o JInternalFrame e abri-lo novamente. Porém já tentei com repaint(); dispose(); e não vai.
O que acontece é: quando dou o dispose() ele meio que “esconde” a janela. Aí se acabo de fazer um cadastro, ela fecha a janela e quando abro novamente os JTextFields ainda estão com os dados do cadastro anterior. já setei como text_field.setText(""); porém, ele abre novamente o JInternalFrame, me deixa fazer o cadastro e encerra, conforme peço que encerre se for inserido no bd, mas aí peço pra abrir novamente o JInternalFrame clicando no botão e ele dispara uma execção:

Exception in thread AWT-EventQueue-0 java.lang.IllegalArgumentException: illeg

al component position

at java.awt.Container.addImpl(Container.java:1048)

at javax.swing.JLayeredPane.addImpl(JLayeredPane.java:212)

at javax.swing.JDesktopPane.addImpl(JDesktopPane.java:470)

at java.awt.Container.add(Container.java:959)

at javax.swing.JFrame.addImpl(JFrame.java:545)

at java.awt.Container.add(Container.java:365)

at Nivel4$20.actionPerformed(Nivel4.java:416)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19

95)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav

a:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel

.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242

)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL

istener.java:236)

at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2

72)

at java.awt.Component.processMouseEvent(Component.java:6263)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6028)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574

)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.

java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre

ad.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Meu código depois que insere no bd:

dispose();

text_nome.setText("");

text_cpf.setText("");

text_rg.setText("");

text_pis.setText("");

text_dtadmissao.setText("");

text_numerocnh.setText("");

text_categoriacnh.setText("");

text_endereco.setText("");

text_numero.setText("");

text_telefone.setText("(  )-    -    “);

text_cel.setText(”");

text_nome.grabFocus();

Já tentei colocar o dispose() depois q setar os textfields como vazio também.

=)

16 Respostas

altitdb

Cara…

porque vc quer fechar ele e abrir novamente??

Você não pode apenas limpar os campos apos a inclusão??

xD~~

thiago_spdvr

Posta o código de como vc chama o JInternalFrame e utilize as tags de código, fica melhor pra ler o código.

C

opa… então. tentei setar somente os TextFields como vazio também ao inves de fechar a janela.
Porém, tenho ações nesses textfields para a tecla Enter. Pressionada a tecla enter aciona o proximo texfield.
Setando os textfields como vazio, quando tento fazer o próximo cadastro, e deixo o campo em branco e só aperto enter, ele preenche o textfield com os dados do cadastro anterior.

Estou setando os text fields assim:

text_nome.grabFocus(); text_nome.setText(""); text_cpf.setText(""); text_rg.setText(""); text_pis.setText(""); text_dtadmissao.setText(""); text_numerocnh.setText(""); text_categoriacnh.setText(""); text_endereco.setText(""); text_numero.setText(""); text_telefone.setText(""); text_cel.setText("");

e chamo o jinternalframe aqui:

cad_motoristas.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, Event.ALT_MASK, false)); // Evento de ATALHO ALT+1
		cad_motoristas.addActionListener(new ActionListener(){ // Ação de botão
		public void actionPerformed(ActionEvent e){
                if(cadMotor == null){
                    cadMotor = new Cadastrar_Motorista();
                    cadMotor.setVisible(true);

                    add(cadMotor);

                }
                else if(!cadMotor.isVisible()){
                    cadMotor.setVisible(true);
                    add(cadMotor);
                }
		}
		});
thiago_spdvr

Vc não esta trabalhando com JDesktopPane ? Talvez seja esse seu problema, adicione um JDesktopPane no seu frame e vê o que acontece.

ArchV

Apenas complementando a idéia:

Após Criar o JDesktopPane no seu Frame, adicione o JInternalFrame no JDesktopPane.

C

Olá Pessoal, criei o JDesktopPane.
e conforme falado, também adicionei o jinternalframe.
mas sem sucesso… os textfields não “zeram”…Mesmo fechando o JInternalFrame, quando abro novamente os textfields não zeram. Continuam preenchidos. segue como ficou o código.

No mesmo JDesktopPane, tenho uma imagem de background que fica assim:

desktop = new JDesktopPane(){
Image im = (new ImageIcon("imagens/centro3.png")).getImage();
public void paintComponent(Graphics g){
g.drawImage(im,0,0,this);            }
};

Este é o código do evento que chama o JInternalFrame:

public void actionPerformed(ActionEvent e){
                if(cadCobrador == null){
                    cadCobrador = new Cadastrar_Cobrador();
                    cadCobrador.setVisible(true);
                    desktop.add(cadCobrador);

                }
                else if(!cadCobrador.isVisible()){
                    cadCobrador.setVisible(true);
                    desktop.add(cadCobrador);
                }
		}
		});
altitdb

Cara…

vc tah colocando pra limpar os campos dos textfields onde??

coloka no construtor que nao tem como nao limpar…

como vc tah fechando esse JInternal??

fecha eles com “this.dispose()

eu faço assim!!

xD~~

C

Pessoal, acho q descobri o problema, porém ainda estou aqui tentando resolver.
Acabo de perceber que somente os textfields que tem mascara que não zera.

try
	{
	cpf = new MaskFormatter("###.###.###-##");
	cpf.setPlaceholderCharacter(' ');
	}
	catch(Exception eeex){}

	try
	{
	data = new MaskFormatter("##/##/####");
	data.setPlaceholderCharacter(' ');
	}
	catch(Exception eeex){}

	try
	{
	tel = new MaskFormatter("(##)-####-####");
	tel.setPlaceholderCharacter(' ');
	}

tenho essas mascaras acima nos textfields, aí quando tento zerar com:
text_telefone.setText("");
a mascara não aceita por causa do formato.
Como poderia zerar isso?

=)

altitdb

try { tfInscricao.setValue(null); MaskFormatter cnpj = new MaskFormatter("##.###.###/####-##"); tfInscricao.setFormatterFactory(new DefaultFormatterFactory(cnpj)); } catch (Exception ex) { ex.printStackTrace(); }

eu faço assim…

xD~~

thiago_spdvr
public void preparaComponentes(){
        
        MaskFormatter maskteleres;   
        try {   
            fmtd_cli_cpf.setText("");
            maskteleres = new MaskFormatter("###.###.###-##");   
            maskteleres.setValidCharacters("[telefone removido]");   
            maskteleres.install(fmtd_cli_cpf);   
        } 
        catch(Exception e) {   
            System.out.println("CPF preparaComponentes > "+e.getMessage());   
        }   
        fmtd_cli_cpf.updateUI();
}

Utilizo este método pra todos os componentes que utilizam mascaras, chamo ele no construtor da classe.

C

Opa, to tentando implementar seu método aqui Thiago, só que deu um erro aqui:

:\Documents and Settings\Camillo\Desktop\Road Desktop\Cadastrar_Motorista.java:505: cannot find symbol

symbol  : method install(javax.swing.JTextField)

location: class javax.swing.text.MaskFormatter

cpf.install(text_cpf);

^

1 error

sabe oq pode ser?
=)

C

Consegui implementar aqui.
Mas pelo que vi, o meu código anterior, também funciona do mesmo jeito.
Ele funciona corretamente, meu problema está sendo na hora de zerar o textfield.
Pq pelo fato dele está mascarado, ele só recebe no formato: ###.###.###-##
Aí quando coloco: text_cpf.setText("");
Ele zera, temporariamente.
Quando faço o primeiro cadastro, e aperto o botão de cadastrar ele zera normal.
Porém se eu deixar o campo com mascara vazio, e apertar enter, que chama da foco ao próximo textfield, ele seta o texto do cadastro anterior.
Segue o código do evento enter:

text_cpf.addKeyListener(new KeyAdapter() { 
		public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
		text_rg.grabFocus();
		}
		}
		});
thiago_spdvr

Se estiver usando JtextField nos campos onde tem mascara, substitua por JFormattedTextField.

C

Olá Thiago, ficou assim meu text field:

this.getContentPane().add(lb_cpf, null);
        text_cpf = new JFormattedTextField(cpf);

msmo assim, nada. msmo erro.
=~

M

Ao se trabalhar com caixas de texto formatadas, é importante lembrar que existem duas coisas distintas: o valor que o JFormattedTextField carrega e o texto que ele exibe. A tarefa dele é justamente fazer a “conversão” entre as duas coisas.

Se você define uma máscara e usa um setText("") esse valor não será aceito simplesmente porque não condiz com a máscara que você definiu.

Sempre que for alterar o valor de um JFormattedTextField use o método setValue(Object). Isso quer dizer que seu código original, porém trocando setText("") por setValue("") deve resolver.

C

Opaaa… valeu Marco pela dica.
Consegui resolver aqui…
ficou assim:

private JFormattedTextField text_cpf;
	try
	{

	cpf = new MaskFormatter("###.###.###-##");
	cpf.setPlaceholderCharacter(' ');

	}

        text_cpf = new JFormattedTextField(cpf);
        text_cpf.setBounds(new Rectangle(6, 110, 130, 21));
        this.getContentPane().add(text_cpf, null);

E quando é feito o cadastro, fica o seguinte código:

text_cpf.setValue("");

Valeu pessoal, Obrigado!

Criado 4 de janeiro de 2010
Ultima resposta 5 de jan. de 2010
Respostas 16
Participantes 5