Eu estou tao perdido que nem sei o assunto que é

10 respostas
alberto665_1

tipo assim eu tenho um JFrame que pega a ação x.

if(evento-clicar.getSource==x){

}

nessa ação x ele executa umas coisas mais, em determinado momento ele deve parar o fluxo.

do{ valor=criar_mini_formulario_("a","b", "c", produto); if(Valor_retornado_do_outro_formulario==1){ System.out.println("dfsdf"); } }while(Valor_retornado_do_outro_formulario!=1);

e abrir o outro JFrame e executar lá as açoes necessarias ai lá se clica em um botao que retorna as ações desse fluxo.

o que esta acontecendo que esta me deixando louco é o seguinte .
ele esta retornando os valores certos do outro formulario mas quando se fecha o outro formulario .eu tenho que clicar denovo nesse botao do evento x para o fluxo continuar

alguem ai sabe o porque disso ai sabe o porque disso???

10 Respostas

renzonuccitelli

Faz tempo que não mexo com Swing, graças a Deus. Meu conselho seria usar Adobe Flex para desktop, o Adobe Air.

Mas tentanto te ajudar, já que vc me mandou MP, o que vc está querendo, pelo que entendi, é ficar esperando no loop até que o outro formulário retorne o valor 1 quando o usuário pressionar um botão. Legal, mas e se o usuário nunca clicar? o que vc precisa é colocar seu código que deseja executar em uma classe (de preferencia interface) e passar para o o seu outro frame. Na hora que ele clicar no botão do outro, aí sim ele executa a lógica que vc kiser. Se vc deixar seu código desse jeito é capaz dele ficar num loop infinito, gastando recurso de bobeira. Não lembro, nem quero lembrar :D , as coisas de Swing, então vou dar idéia de código só, tentando simular as janelas.

Primeiro bole uma interface pra executar seu código. Interface é boa pra desacoplar e para facilitar testes:
public interface CodigoAExecutarInterface {
	// Nesse método vc coloca como argumento o que vai precisar de info da outra tela
	// Pode inclusive encapsular os dados em uma classe separada
	void executaIssoDepoisDeClicarNoBotão(String arg);
}
Aí depois vc implementa a interface, colocando o código que vc quer executar:
public class CodigoAExecutar implements CodigoAExecutarInterface {
	@Override
	public void executaIssoDepoisDeClicarNoBotão(String arg) {
		System.out.println("Executando código depois de clicar no botão do segundo frame, arg recebido: " + arg);
	}
}
Depois então vc extende seu frame para acrescentar nele um atributo com sua interface criada. Eu não extendi aki, mas é só vc colocar o extends aí no seu código:
public class SeuFrame {
	private CodigoAExecutarInterface codigoAExecutar;

	public void setCodigoAExecutar(CodigoAExecutarInterface codigoAExecutar) {
		this.codigoAExecutar = codigoAExecutar;
	}

	void pressionaBotao(String arg) {
		// Aki vc pode fazer alguma lógica de validação nos dados, antes de executar
		codigoAExecutar.executaIssoDepoisDeClicarNoBotão(arg);
	}
}
Então eu montei uma classe para simular o fluxo de vc clicar em um botão, mostrar o outro frame, e depois que clicar no botão desse último, ele executa o que vc desejar:
public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		// simulando que apertar enter fosse clicar no botão do primeiro frame
		scanner.nextLine();
		System.out.println("Botão para abrir frame pressionado");
		// Lógica do primeiro botão
		// Cria seu frame e mostra na tela
		SeuFrame frame = new SeuFrame();
		// Injeta nele o código que vc quer executar depois de clicar no botão
		frame.setCodigoAExecutar(new CodigoAExecutar());
		// simulando que apertar enter fosse clicar no botão do segundo frame
		String arg = scanner.nextLine();
		frame.pressionaBotao(arg);
	}
}

Isso que eu implementei é um pseudo padrão Observer. Seus JButtons da vida implementam esse padrão de projeto, por isso vc tem os AddListeners da vida. Infelizmente Java não tem Closure, o q facilitaria a codificação, inclusive diminuindo linhas de código. Enfim, nessa hora da madruga fiz o melhor que pude.

Precisando de um curso Java, de uma olhada na Nuccitec.

[]s

discorpio

Boa tarde a todos.

Pelo que entendi, se é que eu entendi, a melhor solução para voce, seria quando clicar em evento X, ao invés de abrir JFrames, voce abre JDialogs.

Os JDialogs, são iguais ao JFrames, com uma diferença que eles funcionam como um caixa de diálogo, onde quando eles estão aberto em uma janela modal, não permitem voce clicar em outra janela da aplicação, mantendo o foco no JDialog, e o foco só retorna ao JFrame que o abriu, quando o JDialog é fechado.

Um bom exemplo de uma janela JDialog que eu costumo utilizar é uma janela de InputDialog, que personifiquei para embutir uma máscara, vamos ao exemplo:

public class InputMask extends JDialog implements ActionListener {

    private JLabel prompt = null;
    private MaskFormatter msk = null;
    private JFormattedTextField text = null;
    private JPanel btnpanel;
    private JButton ok, cancel;
    private String response, aprompt, mask;

    public InputMask(JFrame parent, String aprompt, String title, String mask){
        super(parent, title, true); // Aqui o último parâmetro sendo true indica que será modal;
        this.aprompt = aprompt;
        this.mask = mask;
        setLayout(new BorderLayout());
        initComponents();
        setResizable(false);
        setSize(400, 300);
        setLocationRelativeTo(this);
        setResponse("");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public void initComponents(){
        Font font = new Font("Tahoma",0,14);
        prompt = new JLabel(aprompt);
        prompt.setFont(font);
        if (!"".equals(mask)){
            try {
                msk = new MaskFormatter(mask);
                msk.setPlaceholderCharacter('_');
                text = new JFormattedTextField(msk);
            } catch (Exception ex){
                JOptionPane.showMessageDialog(this, ex.getMessage());
            }
        } else {
            text = new JFormattedTextField();
        }
        text.setFont(font);
        text.setColumns(15);
        JPanel textpanel = new JPanel(new GridLayout(1,2));
        textpanel.add(prompt);
        textpanel.add(text);
        getContentPane().add(textpanel, BorderLayout.NORTH);
        ok = new JButton("OK");
        ok.addActionListener(this);
        cancel = new JButton("Cancelar");
        cancel.addActionListener(this);
        cancel.setSize(10, 50);
        btnpanel = new JPanel(new FlowLayout());
        btnpanel.add(ok); btnpanel.add(cancel);
        getContentPane().add(btnpanel, BorderLayout.SOUTH);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==ok){
            setResponse(text.getText());
        } else if (e.getSource()==cancel){
            setResponse("");
        }
        setVisible(false);
        dispose();
    }

    public String getResponse() {
        return response;
    }

Na hora de invocar este JDialog, no primeiro JFrame, voce pode criar um método da seguinte forma:

public String inputBox(JFrame caller, String mens, String title, String mask){
        InputMask imask = new InputMask(caller, mens, title, mask);
        return imask.getResponse();
}

// E depois invocar este mesmo método dentro do mesmo JFrame, assim:

public void actionPerformed(ActionEvent e) {
        if (e.getSource() == x){
            String resp = inputBox(this,"Digite a data ","Pesquisando data","##/##/####");
            if ("".equals(resp)){
                mensagem("Data em branco ou operação cancelada", "Aviso");
            } else {
                lbldata.setText(resp);
            }
        }
}

Repare que quando o voce abre o JDialog “InputMask”, o fluxo do primeiro JFrame é interrompido, passando o fluxo de execução para o JDialog que só o libera após este ser fechado, dando continuidade ao fluxo de execução do JFrame que o invoncou.

Veja que desta forma simples, voce fará o que pretende, isto é, se isso mesmo isto que voce pretende fazer, não precisando criar códigos de desvios condicionais mirabolantes para isto.

alberto665_1

entao eu fiz com o JOptionPane e deu certo.

porem eu gostaria de entender o motivo pelo qual nao funciona quando uso um frame.

no caso eu estou paralisando o 1 formulario para obrigar o usuario a clicar em um botao do novo formulario.

do{   
setEnabled(false);  //bloqueando o formulario atual
valor=criar_mini_formulario_("a","b", "c", produto);   
      if(Valor_retornado_do_outro_formulario==1){   
    System.out.println("dfsdf");   
      }   
}while(Valor_retornado_do_outro_formulario!=1);

e esse novo formulario estou fazendo da seguinte forma

public static int criar_mini_formulario_(String a,String b, String c,final Produto produto){
		JButton botao=new JButton(a);
		JButton botao2=new JButton(b);
		JButton botao3=new JButton(c);
		final JFrame f=new JFrame();
		
		
		f.setVisible(true);
		f.pack();
		

		botao.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent arg0) {
			valor_que_quero_que_retorne=1;
			f.dispose();
			m.setEnabled(true);  //isso aqui é para desbloquear o formulario anterior
			}
			
		});
		
		botao2.addActionListener(new ActionListener() {
		
			public void actionPerformed(ActionEvent arg0) {
				valor_que_quero_que_retorne=2;
				f.dispose();
				
			}
		});
	
		
		botao3.addActionListener(new ActionListener() {
			
			
			public void actionPerformed(ActionEvent arg0) {
					valor_que_quero_que_retorne=3;
					f.dispose();
			}
		});
		
		return valor_que_quero_que_retorne;
	
	}

lembrando que ele retorna corretamente o valor ,porem ele nao continua o fluxo como tinha explicado anteriormente.

eu acho que talvez eu tenha que reativar a ação x.sei lá
o que que esse JOption pane faz para reativar a ação se é que minha hipotese esta certa
???

Anime

Oi alberto665+1,

Desculpa por não ter respondido,mas não consigo entender o que vc quer… :oops: Vamos ver vc tem dois formularios e quer que o usuario aperte um botão para abrir outro…é isso… :roll:

discorpio

Bom dia a todos

Anime:
Oi alberto665+1,

Desculpa por não ter respondido,mas não consigo entender o que vc quer… :oops: Vamos ver vc tem dois formularios e quer que o usuario aperte um botão para abrir outro…é isso… :roll:

Sinceramente também não entendi o que voce deseja, Alberto, a não ser que voce queira que os dois Frames estejam abertos na tela ao mesmo tempo.

Repare que, como voce disse, com JOptionPane funcionou, sabe por quê :?: Simplemente porque o JOptionPane é uma classe destinada a instanciar e abrir [color=red]caixas de diálogo[/color], onde as quais, sempre retornam valores aos JFrames que os invocou, ou seja, “JDialogs”, e é exatamente aquilo que te expliquei no post anterior, só com uma pequena diferença, o JDialog que postei é personalizado, onde foi eu quem o criei.

Contudo, se voce pretende manter os dois Frames abertos, nada te impede que assim o faça, voce pode por exemplo utilizar JInternalFrames com JDesktopPane que são ideais para uma aplicação MDI (Mutiple Documents Interface - Interface de Documentos Múltiplos), porém eu não vejo lógica de se abrir um JInternalFrame de forma Modal, ou seja, bloqueando o acesso a outros Frames, a menos que este não seja um JInternalFrame, e sim um JDialog.

alberto665_1

é isso mesmo eu quero os dois Jframes abertos ao mesmo tempo.
1 formulario fica bloqueado e quando se clica em algum botao do 2 formulario
o 2 formulario fecha e desbloquea o 1 formulario.

o aplicativo ja esta funcionando com os jDialogs.

porem eu gostaria de entender com o JOptionpane consegue bloquear um frame e retornar esse valor.

e o meu exemplo anterior nao conseguiu fazer isso.suponho que eu preciso reativar a ação do evento x pois quando eu abro o 2 frame acho que ação do do evento x é encerrada.

se alguem tirar essa duvida fico muito agredecido.

alberto665_1

estou utilizando o JDialog .

porem nao consigo construir uma tabela corretamente no Jdialog.

ele nao apresenta as as colunas apenas os dados.

exemplo ao inves de mostar

///////////////////////////////////////////////////
nome endereco telefone
alguem algum local 12345678
alguem2 algum local2 22345678
alguem3 algum local3 32345678
///////////////////////////////////////////////

ele mostra

alguem algum local 12345678
alguem2 algum local2 22345678
alguem3 algum local3 32345678

ou seja ele omite as colunas.

import dsda.Principal;

public class NovaJanela2 extends JDialog{


	public NovaJanela2(String a,String b,String c,String [][]dados,String[] colunas){
		super(Principal.PegarFormulario(),c,true);
		botao=new JButton(a);
		botao2=new JButton("Cancelar");
		botao3=new JButton("Voltar");
		
		modelo=new DefaultTableModel( dados, colunas);
		sp=new JScrollPane(tabela);
		tabela=new JTable(modelo);
		
		JPanel painel=new JPanel();
		painel.setLayout(new GridBagLayout());
		GridBagConstraints cc=new GridBagConstraints();
		Insets espaco=new Insets(10, 10, 10, 10);
		cc.insets=espaco;
		
		
		
		cc.gridx=0;
		cc.gridy=1;
		cc.gridwidth=3;
		cc.gridheight=6;
		painel.add(tabela,cc);

		getContentPane().add(painel,BorderLayout.SOUTH);

	
		pack();
		setVisible(true);
	}
}

me ajuda galera porque isso acontece?

Luiz_Aguiar

Se já se achou coloque um título decente em seu post!

alberto665_1

eu ja resolvi esse problema é que eu tinha esquecido do JScrollPane . rsrsrs

Se já se achou coloque um título decente em seu post!

isso é uma ordem ,uma sugestão,uma critica ?

de qualquer forma eu nao tinha alterado o nome do post porque ele tinha um tempo de vida relativamente curto que nem valeria a pena trocar o nome.

topico resolvido.

é assim que encerro um topico digito topico resolvido?

discorpio

Boa tarde Alberto.

Amigo, me desculpe se demorei a responder, pois andava aqui na Secretaria muito ocupado. Ainda bem que resolveu o problema, porém há certas considerações a ser feita com relação a sua tabela, e uma delas é que voce está utilizando “DefaultTableModel”.

Mas o que há de errado com o “DefaultTableModel” :?: :shock: :?:

Não há nada de errado com ele, porém a classe “DefaultTableModel” já está obsoleta, em virtude dela estar engessada em padronizar uma tabela para cada JTable, imagine se voce precisasse de configurar várias tabelas do seu banco de dados em uma grid de dados (JTable) para cada tabela. Certamente voce iria criar vários JTables com vários “DefaultTableModel”, ao passo que com “AbstractTableModel”, além de padronizar as colunas, o tipo de dado que cada célula, bem como de popular um AbstractTableModel com uma matriz de qualquer tipo de dados, e ainda por cima, voce só precisaria de um único JTable para setá-lo a vários “AbstractTableModel” cada qual configurado e populado com os dados de cada tabela.

Para voce ter um idéia de como um AbstractTableModel pode facilitar a vida de um JTable, com ele eu consegui construir um Calendário personalizado, e este projeto estou te mandando agora.

Um abraço.

Criado 6 de novembro de 2010
Ultima resposta 17 de nov. de 2010
Respostas 10
Participantes 5