Criar método para retornar após o usuário clicar em um botão. (parecido com o showInputDialog)

boa noite galera é o seguinte, preciso fazer uma tela de pesquisa para retornar um valor mas apenas quando a pessoa clicar em um botão . . .

atualmente eu faço esta pesquisa da seguinte forma:

tenho uma tela de um caixa
e outra tela de pesquisa com um jTextField, uma jTable e um jButton

então se a pessoa quer pesquisar um produto por exemplo ai clica em pesquisar na tela do caixa dai eu chamo a tela de pesquisa passando como parâmetro pelo metodo construtor um objeto na qual está todos os dados da tela do caixa e utilizo o metodo dispose(), então a tela de pesquisa abre, a pessoa pesquisa e utilizo um metodo para reconhecer o clique na tabela, então quando a pessoa clica no item desejado eu chamarei a tela de caixa e passarei como parametro o mesmo objeto recebido e preencho todos os dados no caixa e acrescento a pesquisa da pessoa . . .

o que eu gostaria de fazer, com certeza vcs já fizeram ou já viram algum sistema de mercantil, onde o operador de caixa pressiona uma tecla ou mesmo clica em um botão da tela do PDV, dai não fecha a tela principal (dispose()) e abre uma tela de pesquisa por cima, então o caixa seleciona o item desejado e já adiciona na tela do PDV . . .

entenderam ? não precisou fechar a tela, muito menos passar por parâmetro algum objeto . . .

um exemplo do que estou precisando seria um JOptionPane.showInputDialog()

se você dentro do seu código colocar o seguinte:

jTextField jtf = new jTextField();
jtf.setText(JOptionPane.showInputDialog(“DIGITE SEU NOME”));

o que acontecerá ?
a principio o jTextField terá o valor “nulo”, então aparecerá uma tela JOptionPane e você digitará alguma coisa então clicará em OK, só então retornará um valor do tipo STRING, mas esse retorno não depende de fechar a outra tela . . .

espero que tenha conseguido explicar direito qual a minha dúvida . . .

Se você colocar o JComponent com JTextField dentro de um JOptionPane a única coisa que você será obrigado a fazer é instanciar o JTextField para não dar um NullPointerExecption na hora a janela de popUp aparecer.

Quando você fechar o JOptionPane não vai acontecer nada, a não ser que você sobreEscreva no método dispose() do JOptionPane para este caso.

Deixa ver se eu entendi…
Você tem uma pela de listagem e quer criar uma telinha de pesquisa/filtro para mostrar um item desta Listagem(JTable)?

Se sim… crie um método que faça a ação da procura que você deseja fazer na telaPDV…

public void doSearchOn(){

     String valor = this.meuJTextField.getText();

     if(valor != null && valor.trim().lenght() != 0)
          //faça sua procura
          //Lembe-se de redesenhar sua tela após a atualização dos dados....
     }
     else{
          //faça sua validação de erro (se necessária)
     }
}

Crie uma class que implemente um FocusListener e dê um addFocusListener no seu textField de pesquisa…

CLASS

[code]public class MyFocusListenerPesquisa implements FocusListener {

private MinhaTelaPDV minhaTelaPDV;

public MyFocusListenerPesquisa(MinhaTelaPDV minhaTelaPDV) {
	this.minhaTelaPDV = minhaTelaPDV;
}

@Override
public void focusGained(FocusEvent arg0) {
	//Quando o textField receber focos quer fazer algo?

}

@Override
public void focusLost(FocusEvent arg0) {
	minhaTelaPDV.doSearchOn()

}

}[/code]
e na sua tela PDV coloque…

seuJtextFieldPesquisa.addFocusListener(new MyFocusListenerPesquisa(this));

ou crie o listener anonimo na classe PDV…

this.meuJTextField.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent arg0) {
				//Quando o textField receber focos quer fazer algo?
				
			}
			
			@Override
			public void focusGained(FocusEvent arg0) {
				NomeDaClasseSuaTelaPDV.this.doSearchOn();
				
			}
		});

Agora se não for o quê você pretende fazer… eu realmente não entendi sua explicação.

Um abraço.

obrigado pela resposta mas não consegui entender direito . . .

tenho a seguinte estrutura

  • objeto talao com os seguintes atributos
    private String cliente;
    private ArrayList servicos;

  • classe caixa cujo no metodo construtor eu recebo o objeto talao, assim que inicio os componentes SWING eu verifico se o objeto possui valores ou se é nulo, se for nulo ele só carrega a tela vazia, já se possuir algum valor ele seta o jTextField CLIENTE com o talao.getCliente() e adiciona na tabela de serviços os serviços da arraylist.

  • e a classe de pesquisa que possui um jTextField, jTable e jButton, cujo no método construtor eu recebo o objeto talao que preencho com os dados da tela caixa . . .

então o usuário digita F1 no campo cliente
ai eu pego com o KeyPressed,
preencho o objeto talao com os servicos ja adicionados
dou um dispose() na tela caixa e
chamo a tela pesquisa passando o objeto talao como parâmetro, new pesquisa(talao).setVisible(true).
vai fechar a tela do caixa e abrir a tela de pesquisa,
então na tela de pesquisa o usuário faz a pesquisa desejada
e eu pego os dados com o mouseClicked na tabela,
preencho o objeto talao com o cliente selecionado e mais o arraylist do objeto recebido por parametro
então eu novamente dou um dispose só que dessa vez na tela pesquisa e
chamo a tela de caixa new caixa(talao).setVisible(true)

então o objeto talao nao vai possuir valores nulos então ele preenchera a tela do caixa com os dados do objeto . . .

só que nesse processo eu fecho a tela caixa e fica aberta só a pesquisa, depois quando o usuário encontra o cliente desejado eu fecho a pesquisa e abro a caixa . . .

as telas estão abaixo . . .

desculpa não passar tantas informações é que trabalho em um cartório e possuimos muitas informações sigilosas . . .

tela caixa

tela pesquisa

Eu não estou entendendo o que você quer. Mas…

Não dé dipose() na janala de caixa.

Quando você instanciar a Classe de pesquisa não passe o Objeto Talão como parametro…
Como a Classe Pesquisa é um jframe que faz algo exclusivo para a Classe Caixa. E Caixa tem a Classe Talao. Mude o construtor da classe Pesquisa para receber a Classe Caixa como paramentro.
(Se você quiser esconder a Janela de Caixa… não dê ‘atributoDeInstaciaDeCaixaVindaDoContrutor.dispose()’… ‘dê um atributoDeInstaciaDeCaixaVindaDoContrutor.setVisible(false)’ e depois um ‘atributoDeInstaciaDeCaixaVindaDoContrutor.revalidate()’ e ‘atributoDeInstaciaDeCaixaVindaDoContrutor.repaint()’).
Dai se você precisar da Casse Talao dentro da Classe Pesquisa… então você acessa pela ‘atributoDeInstaciaDeCaixaVindaDoContrutor.getTalao()’ e faça sua pesquisa…
Quando você fizer a pesquisa dentro da classe Pesquisa. Seta devolta os valores de retorno dentro do ‘atributoDeInstaciaDeCaixaVindaDoContrutor’.
Depois você pode um dispose na Pesquisa.
(Se você escondeu a Janela de Caixa dê um atributoDeInstaciaDeCaixaVindaDoContrutor.setVisible(true))
depois um ‘atributoDeInstaciaDeCaixaVindaDoContrutor.revalidate()’ e ‘atributoDeInstaciaDeCaixaVindaDoContrutor.repaint()’. Pois aqui se você já tiver setado os valores no componetes de tela da janela Caixa ela vai ser redesenhada com os valores do resultado da sua pesquisa atualizados.

Não dá para ver as imagens aqui, pois o proxy aqui no serviço barra elas. Em casa eu dou uma olhada melhor…
Abraço.

Consegui resolver facinho rafael, usando um pouco da tua lógica . . .

na tela do CAIXA eu criei o seguinte método:

    //MÉTODO PARA ADICIONAR UM VALOR NA TABELA
    public void adicionaProduto(String produto) {
        //SETA O CAMPO DE CÓDIGO DE BARRAS EM BRANCO
        jTextField1.setText("");
        //ADICIONA O VALOR PASSADO POR PARÂMETRO NA TABELA
        dtm.addRow(new String[]{produto});
        //DÁ O FOCO NO CAMPO DE CÓDIGO DE BARRAS
        jTextField1.requestFocus();
    }

então no campo de código de barras se eu apertar a tecla “P” ele abre a tela de pesquisa e passa por parâmetro a classe CAIXA

new PesquisaProduto(this).show();

na classe pesquisa eu primeiro instancio o objeto CAIXA

CAIXA c;

public PesquisaProduto(CAIXA c){ this.c = c; }
então quando o cliente seleciona o produto na tabela ele faz o seguinte:

c.adicionaProduto(jTable.getValueAt(jTable.getSelectedRow, 0).toString()); dispose();

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

ANTES eu criava um método para carregar todos os produtos em uma ArrayList,

for (int i = 0; i < TABELA.getRowCount(); i++) { produtos.add(TABELA.getValueAt(i, 0).toString()); }
depois passava essa array por parametro para a tela de pesquisa e fechava a tela do caixa

new TelaDePesquisa(produtos) .show(); dispose();

na tela de pesquisa quando o usuário clicava na tabela adicionava o valor na array

produtos.add(TABELA.getValueAt(TABELA.getSelectedRow, 0).toString()); new TelaDoCaixa(produtos).show(); dispose();

e pra finalizar eu criava um método para adicionar os valores da array na tabela

for (int i = 0; i < produtos.size(); i++) { dtm.addRow(new String[]{produtos.get(i).toString()}); }

DESCULPA A RESPOSTA GRANDE . . .

se você quizer conferir os códigos do jeito que eu queria fazer e do jeito que eu fazia antes . . .

http://www.4shared.com/rar/hQ0c_ih8/Assim_que_eu_fazia.html
http://www.4shared.com/rar/xU1dpzha/Assim_que_eu_queria.html

dentro de cada arquivo tem os arquivos “.java” para ver o código e os arquivos compilados “.jar” para vocês executarem . . .

o código foi feito no NETBEANS por isso é um pouco extenso, não tive tempo de criar em outra ide devido ser teste e ele ser mais rápido para criar telas, e também eu não poderia deixar de postar o resultado aqui . . .

alguem algum dia poderá ter a mesma dúvida que a minha . . .

vlw galera . . .