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.