Boa noite a todos.
Seria muito mais simples você utilizar JDialogs do que JFrames ou JInternalFrames.
JDialogs são janelas normais frequentemente utilizadas como caixas de diálogos que podem ser abertos como modais ou não, dependendo de sua configuração.
Um formulário modal faz exatamente aquilo que voce quer, ou seja, ele não permite que você clique fora de sua janela, até que que você o feche, vamos a um exemplo:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;
public class InputMask extends JDialog implements ActionListener {
private JLabel prompt = null;
private MaskFormatter msk = null;
private JFormattedTextField text = null;
private JButton ok, cancel;
private String response, aprompt, mask;
public InputMask(JFrame parent, String aprompt, String title, String mask){
super(parent, title, true);
this.aprompt = aprompt;
this.mask = mask;
setResizable(false);
initComponents();
setPreferredSize(new Dimension(200, 100));
setResponse("");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
private void initComponents(){
setLayout(new BorderLayout());
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 panelprompt = new JPanel(new GridLayout(2,1));
panelprompt.add(prompt);
panelprompt.add(text);
getContentPane().add(panelprompt, BorderLayout.CENTER);
ok = new JButton("OK");
ok.addActionListener(this);
cancel = new JButton("Cancelar");
cancel.addActionListener(this);
JPanel panelbuttons = new JPanel(new GridLayout(1,2));
panelbuttons.add(ok);
panelbuttons.add(cancel);
getContentPane().add(panelbuttons, 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;
}
public void setResponse(String response) {
this.response = response;
}
}
Praticamente eu criei acima um InputDialog personalizado, onde me permite inserir máscaras, você pode configurará-lo como Modal, utilizando o método “setModal(true)” ou dentro do construtor com a sintaxe “super”, utilizando o último parâmetro, como eu fiz acima assim “super(parent, title, true);”
Agora dentro do frame principal você pode criar um método estático exatamente como faz o InputDialog da Classe JOptionPane, assim:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FramePrincipal extends JFrame {
private String resposta = null;
public FramePrincipal(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
setPreferredSize(new Dimension(400, 400));
JButton btn = new JButton("Digitar data");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
resposta = FramePrincipal.inputBox(null, "Digite uma data", "Data", "##/##/####");
JOptionPane.showMessageDialog(null, "A data é "+resposta);
}
});
getContentPane().add(btn);
pack();
}
public static String inputBox(JFrame caller, String mens, String title, String mask){
InputMask imask = new InputMask(caller, mens, title, mask);
imask.setVisible(true);
return imask.getResponse();
}
}
Voce vai reparar que quando este JDialog está modal, a execução dentro do JFrame parou exatamente na linha “imask.setVisible(true);” e só executará a linha imediatamente abaixo, quando você fechar o JDialog.
Outra coisa que voce precisa reparar é que JDialogs só funcionam como modais, quando voce click dentro da aplicação que o invocou, se o FramePrincipal for menor que a resolução da tela do seu monitor e voce clicar fora da aplicação, a aplicação será minimizada, e quando restaurada, só aparecerá o JDialog, então tenha cuidado de maximar sempre a tela do FramePrincipal quando lidar com JDialogs.
Isto é só pra você ter uma idéia de como configurar JDialogs.