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

10 respostas
F

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?

10 Respostas

erico_kl

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…

F

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

F

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

F

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??

F

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

F

agora sim
fiz assim:

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)
            {

            }
        });

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

jotinhaelloco

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

jotinhaelloco

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!

F

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!

jotinhaelloco
para tentar colocar o foco na primeira parte do IP, eu tento fazer que nem você fez...
d.addWindowFocusListener(new WindowFocusListener()
         {  
            public void windowGainedFocus(WindowEvent e)  
            {  
                parte1.requestFocusInWindow();  
            }  
            public void windowLostFocus(WindowEvent e)  
            {  
  
            }  
        });

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!

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;
        }
    }
Criado 19 de janeiro de 2010
Ultima resposta 1 de mai. de 2010
Respostas 10
Participantes 3