JOptionPane com mascara(entrada de dados)[estava RESOLVIDO] [RESOLVIDO agora sim]

Estou tentando fazer um JOptionPane com mascara para entrada de dados, mas ta dificil
Vi o exemplo da sun de CustomDialog.java mas ta muito comlpexo, então resolvi fazer uma coisa simples:
a ideia é implementar esse método:

mas ai que ta o problema, pois não sei como vou mandar retornar os valores quando o usuario clicar no botao, olha como está:

public static String mostraInputDialogComMascara(JComponent parent, String titulo, String texto, String mascara) { final JInternalFrame frame = new JInternalFrame(titulo, true, true, true, true); JFormattedTextField textField = new JFormattedTextField(Ajudante.getMascara(mascara)); frame.setLayout(new MigLayout("", "[center]20[center]", "[center]")); frame.add(new JLabel(texto), "wrap"); JButton ok = new JButton("OK"); ok.addActionListener(new ListenerOk()); JButton cancelar = new JButton("Cancelar"); cancelar.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { frame.dispose(); } }); frame.add(ok); frame.add(cancelar); }\

Algume ideia?

Você pode passar um array de Object na assinatura do showConfirmDialog que serão os componentes do JOptionPane…
exemplo: digamos que você queira uma caixa de diálogo com uma mensagem informativa e um campo com máscara

MaskFormatter formato = null; try { formato = new MaskFormatter("###.###.###-##"); } catch (ParseException e) { e.printStackTrace(); } JLabel label = new JLabel("Informe seu CPF:"); JFormattedTextField texto = new JFormattedTextField(formato); if (JOptionPane.showConfirmDialog(null, new Object[] {label, texto}, "Autorização", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.YES_OPTION) { System.out.println(texto.getText()); }
assim só mostrará o CPF na console se o usuário clicar em OK…

cara, muito obrigado
vou testar agora isso dai e se der certo ja marco como resolvido

se alguem precisar funcionou e ficou assim

public static String mostraInputDialogComMascara(String titulo, String texto, String mascara) { Object[] objetos = new Object[2]; objetos[0] = new JLabel(texto); JFormattedTextField text = new JFormattedTextField(Ajudante.getMascara(mascara)); objetos[1] = text; if(JOptionPane.showConfirmDialog(null, objetos, titulo, JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) return text.getText(); else return null; }

muito obrigado

sim mas agora tenho um problema
logo q o OptionPane aparece, fica muito bom mas o Focus vai para o botao OK
e eu quero que vá para o TextField, ja tentei de tudo mas nao funcionou
o que faco??

tentei isso

....            
            SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                text.requestFocus();
                text.requestFocusInWindow();
            }
        });
        if(JOptionPane.showConfirmDialog(null, objetos, titulo, JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION)
....

porem nao funcionou

agora sim
fiz assim:

[code] JOptionPane pane = new JOptionPane(objetos);
pane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
pane.setOptionType(JOptionPane.OK_CANCEL_OPTION);
JDialog d = pane.createDialog(“Adicionar”);
d.addWindowFocusListener(new WindowFocusListener()
{
public void windowGainedFocus(WindowEvent e)
{
text.requestFocusInWindow();
}
public void windowLostFocus(WindowEvent e)
{

        }
    });[/code]

Agora so falta ajeitar o tamanho do TextField ja que ele ta ocupando todo o tamanho horizontal

caraa, eu tb to quebrando a cabeça tentando colocar uma máscara no JOptionPane…
Fui tentar usar sua solução, mas vc não colocou a parte do “Ajudante”…

O que seria essa classe? Você teria ai como o ficou o código final (com o focus no campo de texto, e o campo de texto redimensionado)??

[]'s

opa, já mexi aki e consegui fazer o que eu queria…

public static String mostraInputDialogComMascaraIP(String titulo, String texto) { JPanel painel = new JPanel(); Object[] objetos = new Object[2]; objetos[0] = new JLabel(texto); JLabel ponto1 = new JLabel("."); JLabel ponto2 = new JLabel("."); JLabel ponto3 = new JLabel("."); JFormattedTextField parte1 = null; JFormattedTextField parte2 = null; JFormattedTextField parte3 = null; JFormattedTextField parte4 = null; try { parte1 = new JFormattedTextField(new MaskFormatter("###")); parte2 = new JFormattedTextField(new MaskFormatter("###")); parte3 = new JFormattedTextField(new MaskFormatter("###")); parte4 = new JFormattedTextField(new MaskFormatter("###")); } catch (ParseException ex) { ex.printStackTrace(); } painel.add(parte1); painel.add(ponto1); painel.add(parte2); painel.add(ponto2); painel.add(parte3); painel.add(ponto3); painel.add(parte4); objetos[1] = painel; if (JOptionPane.showConfirmDialog(null, objetos, titulo, JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { return parte1.getText() + "." + parte2.getText() + "." + parte3.getText() + "." + parte4.getText(); } else { return null; } }

Só que agora tô com um outro problema… os campos de texto ficam muito pequenos no JOptionPane (não dá para digitar nem 3 números)… tentei redimesiona-los mas só dá erro… tem tb o problema do campo de texto se apagar se nao forem digitados 3 números (para o caso da parte do IP ter menos de 3 numeros…) e ainda tem o problema do foco que ja fica direto no OK… ahsahsahuhsau

olha como ficou:

alguem ai pode dar uma força???

Desde já agradeço!
Fikem na paz!

O foco vc conserta igual eu fiz, com o window focus listener.
Agora pra tamanho dos textfield e vc quer tem q setar size e usar gerenciador de layout melhor…
Vc pode tambem, fazer um textfield só pra tudo tipo assim
Mascara seria ###.###.###.###
sacou?
Se quiser separado os 4 textfield briga com os gerenciadores de layout ai…
Desculpa qq coisa eh q é sexta, ai ja viu néé!

PS: ah e win95 ja era, tinha o problema da porta 139 http://en.wikipedia.org/wiki/Denial-of-service_attack#Nuke
hehe abracos

Use Linux - de preferencia Debian!

para tentar colocar o foco na primeira parte do IP, eu tento fazer que nem você fez…

[code] d.addWindowFocusListener(new WindowFocusListener()
{
public void windowGainedFocus(WindowEvent e)
{
parte1.requestFocusInWindow();
}
public void windowLostFocus(WindowEvent e)
{

        }  
    });[/code]

Só que o NetBeans sublinha tudo de vermelho, reclamendo que o addWindowFocusListener não pode ser aplicado ao tipo especificado… e agora?

PS.: Consegui não ter que digitar todo o campo na máscara, segue o código que como está o método caso alguem precise!

[code] public static String mostraInputDialogComMascaraIP(String titulo, String texto) {
JPanel painel = new JPanel();
Object[] objetos = new Object[2];
objetos[0] = new JLabel(texto);
JLabel ponto1 = new JLabel(".");
JLabel ponto2 = new JLabel(".");
JLabel ponto3 = new JLabel(".");
JFormattedTextField parte1 = null;
JFormattedTextField parte2 = null;
JFormattedTextField parte3 = null;
JFormattedTextField parte4 = null;
try {
MaskFormatter msk1 = new MaskFormatter("###");
MaskFormatter msk2 = new MaskFormatter("###");
MaskFormatter msk3 = new MaskFormatter("###");
MaskFormatter msk4 = new MaskFormatter("###");
parte1 = new JFormattedTextField(msk1);
parte1.setFocusLostBehavior(JFormattedTextField.COMMIT);
msk1.setPlaceholder(parte1.getText());
parte2 = new JFormattedTextField(msk2);
parte2.setFocusLostBehavior(JFormattedTextField.COMMIT);
msk2.setPlaceholder(parte2.getText());
parte3 = new JFormattedTextField(msk3);
parte3.setFocusLostBehavior(JFormattedTextField.COMMIT);
msk3.setPlaceholder(parte3.getText());
parte4 = new JFormattedTextField(msk4);
parte4.setFocusLostBehavior(JFormattedTextField.COMMIT);
msk4.setPlaceholder(parte4.getText());
} catch (ParseException ex) {
ex.printStackTrace();
}
painel.add(parte1);
painel.add(ponto1);
painel.add(parte2);
painel.add(ponto2);
painel.add(parte3);
painel.add(ponto3);
painel.add(parte4);
objetos[1] = painel;

    if (JOptionPane.showConfirmDialog(null, objetos, titulo, JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) {
        return (parte1.getText().trim() + "." + parte2.getText().trim() + "." + parte3.getText().trim() + "." + parte4.getText().trim());
    } else {
        return null;
    }
}[/code]