GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Setar controle em JavaFX

Tenho uma classe Mask e instancio ela assim no controller:
Mask textfield = new Mask();
textfield.setMask("###.###.###-##");

Acontece que preciso setar ela no meu controle txtCPF que foi atribuido assim:
@FXML private TextField txtCPF;
Como faço pra instanciar a classe no controle txtCPF?
no FXML eu consegui mas não sei se é uma boa prática e no Scene Builder o controle fica oculto. queria setar no controller e não no fxml. Desde já agradeço.

Não conheço muito de javafx, mas acho que se vc definir o elemento no fxml com um id, como por exemplo:

<!-- chutei o nome do elemento pq não sei blz -->
<MaskField mask="DDD.DDD.DDD.DDD" fx:id="minhaMask" />

vc conseguirá ter acesso ao elemento no controller assim:

@FXML
private MaskField minhaMask; // de novo, não sei que classe que é, apenas coloquei para exemplo =)

Lucas_Camara Obrigado pela Resposta. No FXML eu consegui fazer eu queria na classe controller com o TextField txtCPF que adicionei no Scene Builder sem alterar o atributo. eu instancio a classe mask
Mask textfield = new Mask();
e queria setar o objeto textfield instanciado da classe mask no txtCPF entende.
ai que não consigo fazer.

Você tem um exemplo de um programinha resumido com o Erro e o que de fato quer fazer?

Não entendi direito sua dúvida.

j-menezes obrigado pela resposta. Estou precisando usar mascaras em textfields. Tem umas classes que vi, mas não entendi o conceito direito e não consegui usa-las, ate porque pelas postagem serem antigas fiquei na dúvida se não teria algo mais moderno. Estou estudando javafx sou iniciante e tenho muita dificuldade em criar classe com mascara. Você tem exemplos de alguma mascara para eu entender como fazer?

Veja o funcionamento desse componente que achei no github: https://github.com/gbfragoso/MaskedTextField. Ele tem as opções de usar com e sem fxml.

Lucas_Camara Obrigado Pela resposta, mas foi justamente sobre essa classe que criei esse tópico. Não consigo usar essa classe na classe controller só no FXML por isso que perguntei. é possível usar sem ser no FXML?

Estranho pq tu tah tentando instanciar a classe Mask, e no exemplo do link é MaskedTextField.

De qual pacote é essa classe Mask que vc está tentando usar?

Lucas_Camara Obrigado pela Resposta. No FXML eu consegui fazer, eu queria na classe controller com o controle txtCPF que adicionei no Scene Builder sem alterar o atributo. eu instancio a classe MaskedTextField assim na classe controller do meu stage:
MaskedTextField text = new MaskedTextField();
agora queria usar no txtCPF que esta na classe Controller do meu projeto.

Imagino que esse txtCPF seja um textfield, mas o MaskedTextField também é um textfield, só que com a capacidade de ter máscara. Ou seja, ou vc usa o textfield ou o maskedtextfield para o campo txtCPF (não tem essa de usar um sobre o outro).

obs.: Se vc olhar o código da classe MaskedTextField, vc verá que ela herda de Textfield.

Na verdade preciso desenvolver mascaras para textfield.

Pra colocar uma Classe dentro do SceneBuilder tá uma coisa incrivelmente simples.
Nada daquela complexidade toda do JavaBeans pra usar com o Swing dentro do NetBeans por exemplo.

Então é assim, primeiro desenvolva tudo sem pensar em SceneBuilder, usando os sets e gets normalmente, depois disso basta colocar dentro do SceneBuilder e pronto!.

Vai funcionar tanto dentro do SceneBuilder como fora dele.

Essa coisa de mascara sempre me atormentou assim como Docking, sempre que via alguma solução de terceiro parece que faltava alguma coisa do meu gosto, então resolvi desenvolver um pra uso próprio.

Detalhe, basta estender TextField, então na hora de usar o SceneBuilder, no lugar do TextField vc coloca o seu extendido.

Cara Ajuda me por favor.
tu tem uma classe com um exemplo de mascara. qualquer mascara pra entender o conceito.

Posso te ajudar em suas duvidas dentro do meu conhecimento e do meu tempo.

Penso que a melhor forma não seja te passar tudo pronto e sim lhe mostrar um esboço e esses esboços você acha na internet.

Mas vou ver um código de um americano aqui, então você terá uma ideia de como fazer um seu e profissa.

Agradeço.

j-menezes e Lucas-Camara.
Eu fiz a mascara.

Codigo da classe

import javafx.application.Platform;
import javafx.scene.control.TextField;

public class TesteMascara  {

private static void limitarTamanhoCampo(TextField textField, Integer tamanho){
    textField.textProperty().addListener((observable, valorAntigo, valorNovo) -> {
        if(valorNovo == null || valorNovo.length() > tamanho ){
            textField.setText(valorAntigo);
        }
    });
}

private static void posicionarCursor(TextField textField) {
    Platform.runLater(() -> {
        if(textField.getText().length() !=0){
            textField.positionCaret(textField.getText().length());
        }
    });
}  

public static void mascaraCPF(TextField textField) {
    TesteMascara.limitarTamanhoCampo(textField, 14);
    textField.lengthProperty().addListener((observable, valorAntigo, valorNovo) -> {
        String textoDigitado = textField.getText();
       textoDigitado = textoDigitado.replaceAll("[^0-9]", "");
       textoDigitado = textoDigitado.replaceAll("([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2})$", "$1.$2.$3-$4");
        textField.setText(textoDigitado);
        TesteMascara.posicionarCursor(textField);
    });

}  

}

/**
* Para referenciar ela na classe controller sem o fxml 
* no metodo initialize onde o textFieldTeste é o meu txtCPF.setText().
* 
* TesteMascara.mascaraCPF(textFieldTeste);
*/

Editei o post e Resolvido. Agradeço a J-menezes e Lucas-Camara Pela Atenção. Qualquer melhoria será bem vindo mas por enquanto esta rodanto legal. Qualquer bug volto aqui.

Dá sim, mas não agora, provável que possa dar uma olhada somente no final da semana, se até lá não tiver resolvido me dá um toque que verei seu código.

//