Duvida sobre caixa de dialogo podendo digitar apenas Regex especifico

Boa tarde, estou desenvolvendo uma aplicação que ao clicar com o botão direito do mouse e escolhendo um menu especifico, ela vai abrir uma caixa de dialogo para pegar um valor numérico digitado pelo usuário. No que eu li sobre o JOptionPane não achei nada dele poder modificar a mascara do JTextField dentro dele para isso. Já existe alguma classe pronta que faz isso ou é melhor desenvolver no braco?
No momento estou fazendo teste usando o JOptionPane mesmo.

JMenuItem atualizarCFOPProdutosTodos = new JMenuItem("Atualizar Todos"); 
        atualizarCFOPProdutosTodos.addActionListener(new ActionListener() {
            @Override 
            public void actionPerformed(ActionEvent e) {
                try{
                    String cfop=JOptionPane.showInputDialog(this, "Insira o CFOP");
                    for(int i=0;i<sorter.getViewRowCount();i++){
                        
                        Registry r = LocateRegistry.getRegistry(ip, porta);
                        servico = (InterfaceCadastroProduto) r.lookup("CadastroProduto");
                        CadastroProduto cadastroProduto=modelo.getLinha(sorter.convertRowIndexToModel(i));
                        if(cadastroProduto.getCFOP().equals(cfop)){
                                continue;
                            }
                        cadastroProduto.setCFOP(cfop);
                        servico.alterarProduto(cadastroProduto);
                    }
                }catch (NotBoundException ex) {
                    ex.printStackTrace();
                }catch (RemoteException ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Erro na conexão com o Servidor", "Atenção", JOptionPane.ERROR_MESSAGE);
                    return;
                }
            }
        });

Bom se alguém tiver tido esse mesmo problema e quiser uma solução, vou postar a classe que eu fiz. DecimalField e NumeralField são duas classes que fiz que extend a JTextField, você pode trocar pela que você fez, ou se quiser pode me pedir que mando o fonte delas. Usei groupLayoult para fazer, deixo o frame sempre no meio e na mensagem se usar o /n ele cria linhas, também deixo aqui aberto para quem quiser melhorar o codigo poder postar. Também se tiver alguma dúvida de como usa pode me perguntar que respondo.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ProcedimentosReutilizaveis;

import Fields.DecimalField;
import Fields.NumeralField;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.GroupLayout.Group;
import javax.swing.GroupLayout.SequentialGroup;
import static javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author Heitor
 */
public class DialogRetorno extends javax.swing.JDialog {

    /**
     * Creates new form DialogRetorno
     */
    private int escolha;
    private DecimalField mensagemDouble;
    private NumeralField mensagemInteger;
    private JFormattedTextField textFieldFormatado;
    private int tipoCriador;
/**
 * 
 * @param parent
 * @param modal
 * @param tamanhoLetra Tamanho da Letra do Texto
 * @param mensagem Mensagem do Texto
 * @param tipoCriador valor 0 Texto Comum, valor 1 Texto Numero Inteiro, valor 2 Texto Double
 */    
    public DialogRetorno(java.awt.Frame parent, boolean modal,int tamanhoLetra,String mensagem,int tipoCriador) {
        super(parent, modal);
        switch (tipoCriador) {
            case 0:
                jTFMensagem=new JTextField();
                initComponentsJTextField(mensagem, tipoCriador, tamanhoLetra,jTFMensagem);
                break;
            case 1:
                mensagemInteger=new NumeralField();
                initComponentsJTextField(mensagem, tipoCriador, tamanhoLetra,mensagemInteger);
                break;
            case 2:
                mensagemDouble=new DecimalField();
                initComponentsJTextField(mensagem, tipoCriador, tamanhoLetra,mensagemDouble);
                break;
            case 3:
                textFieldFormatado=new JFormattedTextField();
                initComponentsJTextField(mensagem, tipoCriador, tamanhoLetra,textFieldFormatado);
                break;    
            default:
                break;
        }
        setPosicao();
        eventosAtalho();
        this.tipoCriador=tipoCriador;
    }
    /**
     * coloca o Dialog no meio da tela
     */
    private void setPosicao() {
        Dimension screenSize =
                Toolkit.getDefaultToolkit().getScreenSize();
        setLocation(screenSize.width / 2 - (this.getWidth() / 2),
                screenSize.height / 2 - (this.getHeight() / 2));
    }
    
    /**
     * Responsável por iniciar os métodos a serem usados posteriormentes
     */
    private void eventosAtalho(){
        getRootPane().getActionMap().put("Selecionar",new javax.swing.AbstractAction() {  
        public void actionPerformed(ActionEvent e) {  
           jBOkActionPerformed(null);           
        }});
        getRootPane().getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "Selecionar");
        //Adicionar Mapa do botão cancelar, para poder ser utilizado
        getRootPane().getActionMap().put("Cancelar",new javax.swing.AbstractAction() {  
        public void actionPerformed(ActionEvent e) {           
            jBCancelarActionPerformed(null);
        }});
        getRootPane().getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "Cancelar");
    }
    
    /**
     * 
     * @return String - Retorna o texto Digitado como String
     */
    public String getText(){
        switch (tipoCriador) {
            case 0:
                return jTFMensagem.getText();                
            case 1:
                return mensagemInteger.getText();                
            case 2:
                return mensagemDouble.getText();                
            case 3:
                return textFieldFormatado.getText();
            default:
                return null;
        }
    }
    
    /**
     * 
     * @return double - Retorna o texto digitado em formato double
     */
    public double pegarValorDecimalDigitado(){ 
        if(tipoCriador!=2){
            return -1;
        }
        return mensagemDouble.getValue();
    }
        
    /**
     * 
     * @return int - Retorna o texto digitado em formato int, caso não seja do tipoCriador 1 retorna -1
     */    
    public int pegarValorInteiroDigitado(){
        if(tipoCriador!=1){
            return -1;
        }
        return mensagemInteger.getValue();
    }
        
    /**
     * 
     * @param maxNumeros maximo de numeros permitidos no TextField 
     */
    public void setMaxNumerosInteiros(int maxNumeros){
        if(tipoCriador!=1){
            return;
        }
        mensagemInteger.setMaxDigits(maxNumeros);        
    }
    
    /**
     * Quando o tipoCriador for 3, você pode alterar a Mascara do JFormattedTextField
     * @param mask String que contem a mascara
     */
    public void setMascaraTextField(String mask){
        if(tipoCriador!=3){
            return;
        }
        try {
            MaskFormatter maskFormatter= new MaskFormatter(mask);        
            textFieldFormatado.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(maskFormatter));
        } catch (ParseException ex) {
            Logger.getLogger(DialogRetorno.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @return int 0 para botao OK e 1 para botao Cancelar
     */
    public int botaoSelecionado(){
        return escolha;
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
                         

    private void initComponentsJTextField(String texto,int tipoMensagem,int tamanhoFonte,Component jTextField) {

        jPanel1 = new javax.swing.JPanel(); 
        jLabel1 = new javax.swing.JLabel();        
        jBOk = new javax.swing.JButton();
        jBCancelar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

        jLabel1.setText(texto);
        jLabel1.setFont(new java.awt.Font("Tahoma", 0, tamanhoFonte));
        int stringWidth = jLabel1.getFontMetrics(jLabel1.getFont()).stringWidth(texto);
        int stringHeight = jLabel1.getFontMetrics(jLabel1.getFont()).getHeight();
        System.out.println(stringWidth);
        
        jBOk.setText("OK");
        jBOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBOkActionPerformed(evt);
            }
        });

        jBCancelar.setText("Cancelar");
        jBCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBCancelarActionPerformed(evt);
            }
        });
        
        
            //stringWidth = jLabel1.getFontMetrics(jLabel1.getFont()).stringWidth(texto);
            //stringHeight = jLabel1.getFontMetrics(jLabel1.getFont()).getHeight();
            stringWidth = 0;
            stringHeight = 0;
            String[] linhasMensagem=texto.split("\n");
            List<JLabel> listaJLabel= new ArrayList();
            System.out.println("Tamanho vetor Linhas: "+linhasMensagem.length);
            for(int i=0;i<linhasMensagem.length;i++){
                JLabel jLabel=new JLabel();
                jLabel.setText(linhasMensagem[i]);
                jLabel.setFont(new java.awt.Font("Tahoma", 0, tamanhoFonte));
                listaJLabel.add(jLabel);
                int stringWidthFor = jLabel.getFontMetrics(jLabel.getFont()).stringWidth(linhasMensagem[i]);
                if(stringWidth<stringWidthFor){
                    stringWidth=stringWidthFor;
                }
            }
            int gapBoataoOk=0;
            int gapTextField=0;
            if(stringWidth>177){                
                gapBoataoOk=(stringWidth-177)/2;            
                gapTextField=(stringWidth-177)/2;
            }
            System.out.println("entrou");
            System.out.println(gapTextField);
            javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout); 
        Group groupHorizontal = null;
        Group groupVertical = null;
        SequentialGroup grupoSequencialHorizontal=null;
        SequentialGroup grupoSequencialVertical=null;
        Group groupHorizontalFor = null;
        for(int i=0;i<linhasMensagem.length;i++){             
            if(i==0){                
                groupHorizontalFor=jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(listaJLabel.get(i), javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE);
                
                grupoSequencialVertical=jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(listaJLabel.get(i), javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(10, 10, 10);
            }
            else{
                groupHorizontalFor.addComponent(listaJLabel.get(i), javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE);
                
                grupoSequencialVertical.addComponent(listaJLabel.get(i), javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(10, 10, 10);
                        
            }
        }        
        Group testegroup=jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGap(gapBoataoOk,gapBoataoOk,gapBoataoOk)    
                                .addComponent(jBOk)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jBCancelar))
                            .addGroup(jPanel1Layout.createSequentialGroup()    
                                .addGap(gapTextField,gapTextField,gapTextField)
                                .addComponent(jTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE));
        groupHorizontalFor.addGroup(testegroup);                    
        grupoSequencialHorizontal=jPanel1Layout.createSequentialGroup()
            .addGap(31, 31, 31)
            .addGroup(groupHorizontalFor)
            .addContainerGap(31, Short.MAX_VALUE);
        groupHorizontal=jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(grupoSequencialHorizontal);
            jPanel1Layout.setHorizontalGroup(groupHorizontal);

        jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jBCancelar, jBOk});        
        
        grupoSequencialVertical.addGroup(jPanel1Layout.createSequentialGroup()                    
            .addComponent(jTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jBOk)
                .addComponent(jBCancelar))
            .addContainerGap(18, Short.MAX_VALUE));
        groupVertical=jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(grupoSequencialVertical);
            jPanel1Layout.setVerticalGroup(groupVertical);
        
        

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );        
        pack();        
    }
    
    private void jBOkActionPerformed(java.awt.event.ActionEvent evt) {                                     
        escolha=0;
        dispose();
    }                                    

    private void jBCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        escolha=1;
        dispose();
    }                                          

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(DialogRetorno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(DialogRetorno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(DialogRetorno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(DialogRetorno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the dialog */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                DialogRetorno dialog = new DialogRetorno(new javax.swing.JFrame(), true,15,"Insira o Texto Aqui",0);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jBCancelar;
    private javax.swing.JButton jBOk;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTFMensagem;
    // End of variables declaration                   
}
1 curtida