[RESOLVIDO]Mudar Cor de um Textfiel Através de um Laço For

Boa tarde pessoal tudo bem?

Desde já deixo claro que sou sono em Java e gostaria de ajuda, meu problema é o seguinte.

Tenho um formulário com 36 TextField e um txtQuantidade, gostaria que no evento do txtQuantidade quando um numero for inserido, ele capture o valor da txtQuantidade, e joga ele dentro de um for, para por cor nas 36 txtFields sem eu precisar digitar um por uma.

for (JTextField campo : meuArrayOuMinhaColecaoDeTextFields) {
    campo.setBackground(corDesejada);
}

IMG-20201113-WA0036%20(002)

Tentei algo tipo a imagem anexado.

Na imagem em anexo você está criando um novo JTextField, fazendo um laço e alterando alterando o fundo pra verde, e não faz nada com ele, nem está adicionando à dia tela.

Afinal você quer mudar as cores de seus JTextField existentes ou quer adicionar novos?

Posta o fonte completo de sua tela, mas posta o código, pois raramente alguém vai se dar o trabalho de copiar código de uma imagem.

Staroski perdão, ai ideia é o seguinte, tenho 36 textfiels ambas estão com o começo do nome txtLacres1, 2, 3, 4 etc, por isso tentei jogar ele em um loop, até 36 e mudar apenas o final com o contador, mas não funcionou. Pois o java não reconhece o tipo como um nome de um campo de texto. No momento meu código inteiro em meu projeto é apenas esse. Por isso tentei tirar um print, estou no trabalho agora assim que chegar em casa, posto o código. Desde já agradeço a intenção de me ajudar. Bom fim de semana brow.

Então você quer acessar um atributo através do nome pelo qual ele foi declarado na classe, nesse caso você tem que usar reflexão computacional.

Você pode criar uma classe utilitária como esta:

import java.lang.reflect.Field;

public final class Reflector {

    /**
     * @param name   O nome do atributo a ser encontrado.
     * 
     * @param type   O objeto Class correspondente ao tipo de dado do atributo.
     * 
     * @param object O objeto da classe onde é pra localizar o atributo.
     * 
     * @return Uma referência ao objeto do atributo encontrado ou <code>null</code> se não for encontrado um atributo com o nome informado.
     */
    @SuppressWarnings("unchecked")
    public static <T> T findAttributeByName(String name, Class<T> type, Object object) {
        try {
            Class<? extends Object> parentClass = object.getClass();
            while (parentClass != null) {
                Field[] attributes = parentClass.getDeclaredFields();
                for (Field attribute : attributes) {
                    if (type.isAssignableFrom(attribute.getType()) && name.equals(attribute.getName())) {
                        attribute.setAccessible(true);
                        return (T) attribute.get(object);
                    }
                }
                parentClass = parentClass.getSuperclass();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private Reflector() {}
}

E aí usar o método findAttributeByName para encontrar os JTextFields de sua tela, dessa forma:

private void alterarCorDeFundoDosTxts(Color cor) {
    Exemplo objetoPai = this;
    Class<JTextField> tipoDoAtributo = JTextField.class;
    for (int i = 1; i <= 36; i++) {
        String nomeDoAtributo = "txtLacres" + i;
        JTextField textField = Reflector.findAttributeByName(nomeDoAtributo, tipoDoAtributo, objetoPai);
        if (textField != null) {
            textField.setBackground(cor);
        }
    }
}

Veja abaixo um exemplo hipotético onde você digita um valor RGB no primeiro campo e todos os outros tem a sua cor de fundo alterada:

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

@SuppressWarnings("serial")
public class Exemplo extends JFrame {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new Exemplo().setVisible(true);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private JTextField txtCampo1 = new JTextField();
    private JTextField txtCampo2 = new JTextField();
    private JTextField txtCampo3 = new JTextField();
    private JTextField txtCampo4 = new JTextField();
    private JTextField txtCampo5 = new JTextField();
    private JTextField txtCampo6 = new JTextField();
    private JTextField txtCampo7 = new JTextField();
    private JTextField txtCampo8 = new JTextField();

    Exemplo() {
        super("exemplo");
        setSize(320, 640);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel contentPane = (JPanel) getContentPane();
        contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        contentPane.setLayout(new GridLayout(16, 1, 10, 10));
        contentPane.add(new JLabel("Campo 1: (Digite uma cor RGB)"));
        contentPane.add(txtCampo1);
        contentPane.add(new JLabel("Campo 2:"));
        contentPane.add(txtCampo2);
        contentPane.add(new JLabel("Campo 3:"));
        contentPane.add(txtCampo3);
        contentPane.add(new JLabel("Campo 4:"));
        contentPane.add(txtCampo4);
        contentPane.add(new JLabel("Campo 5:"));
        contentPane.add(txtCampo5);
        contentPane.add(new JLabel("Campo 6:"));
        contentPane.add(txtCampo6);
        contentPane.add(new JLabel("Campo 7:"));
        contentPane.add(txtCampo7);
        contentPane.add(new JLabel("Campo 8:"));
        contentPane.add(txtCampo8);

        txtCampo1.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                digitouAlgoNoTxtCampo1();
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                digitouAlgoNoTxtCampo1();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                digitouAlgoNoTxtCampo1();
            }
        });
    }

    private void digitouAlgoNoTxtCampo1() {
        try {
            String texto = txtCampo1.getText();
            int rgb = Integer.parseInt(texto, 16);
            alterarCorDeFundoDosTxts(new Color(rgb));
        } catch (NumberFormatException e) {
            // não digitou um rgb válido, ignorar
        }
    }

    private void alterarCorDeFundoDosTxts(Color cor) {
        Exemplo objetoPai = this;
        Class<JTextField> tipoDoAtributo = JTextField.class;
        for (int i = 1; i <= 8; i++) {
            String nomeDoAtributo = "txtCampo" + i;
            JTextField textField = Reflector.findAttributeByName(nomeDoAtributo, tipoDoAtributo, objetoPai);
            if (textField != null) {
                textField.setBackground(cor);
            }
        }
    }
}

Print-screens do programa em execução:

Sem digitar nada:

Digitando ffff00 (Amarelo):

Digitando c0c0c0 (Cinza)>

Staroski boa tarde, entendi o código disponibilizado e a explicação, mas ainda não é isso que preciso, sei que deviria estudar mais antes de entrar na interface gráfica, mas como vou aprender sem socar a cara na lama, acho que me expressei errado na explicação que passei, vou tentar passar novamente, e se não achar incomodo em me ajudar fica aqui meus agradecimentos desde já.

Explicação logo abaixo…

Bom eu tenho um campo de texto (JTextField) onde ele armazenará a quantidade, para isso crio uma variável inteira que captura a quantidade informada pelo usuário. Até aqui consegui fazer.

Meu problema está aqui,

Tenho 36 campos disponível para o usuário digitar os lacres, só que quero que quando o usuário digitar a quantidade de lacres ficasse disponível apenas os campos referente a quantidade que ele informou,

Ex: são 36 campos, o usuário informou a quantidade 10.

Então será liberado apenas os 10 campos e o restante permanece bloqueado e com uma cor cinza, e assim por diante independente de quantos for a quantidade entra 0 - 36.

A questão é que em Vba eu consegui manipular o Textbox e funciona plenamente a lógica que utilizei, mas no Java deu zica.

Desde já agradeço muito sua intenção em ajudar. Abraços um excelente dia.

Mas é só adaptar o código, você vai fazer um for dessa forma:

private void atualizaCamposLacre(int quantidade) {
    Exemplo objetoPai = this;
    Class<JTextField> tipoDoAtributo = JTextField.class;
    for (int i = 1; i <= 36; i++) {
        String nomeDoAtributo = "txtLacre" + i;
        JTextField textField = Reflector.findAttributeByName(nomeDoAtributo, tipoDoAtributo, objetoPai);
        if (textField != null) {
            boolean habilita = i <= quantidade;
            textField.setEnabled(habilita);
            if (habilita) {
                textField.setBackground(Color.GREEN);
            } else {
                textField.setBackground(Color.GRAY);
            }
        }
    }
}

Execute o exemplo abaixo para verificar a funcionalidade:

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

@SuppressWarnings("serial")
public class Exemplo extends JFrame {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new Exemplo().setVisible(true);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private JTextField txtQuantidade = new JTextField();

    // campos Lacre de 1 à 7
    private JTextField txtLacre1 = new JTextField();
    private JTextField txtLacre2 = new JTextField();
    private JTextField txtLacre3 = new JTextField();
    private JTextField txtLacre4 = new JTextField();
    private JTextField txtLacre5 = new JTextField();
    private JTextField txtLacre6 = new JTextField();
    private JTextField txtLacre7 = new JTextField();

    Exemplo() {
        super("exemplo");
        setSize(320, 640);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel contentPane = (JPanel) getContentPane();
        contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        contentPane.setLayout(new GridLayout(16, 1, 10, 10));
        contentPane.add(new JLabel("Quantidade:"));
        contentPane.add(txtQuantidade);
        contentPane.add(new JLabel("Lacre 1:"));
        contentPane.add(txtLacre1);
        contentPane.add(new JLabel("Lacre 2:"));
        contentPane.add(txtLacre2);
        contentPane.add(new JLabel("Lacre 3:"));
        contentPane.add(txtLacre3);
        contentPane.add(new JLabel("Lacre 4:"));
        contentPane.add(txtLacre4);
        contentPane.add(new JLabel("Lacre 5:"));
        contentPane.add(txtLacre5);
        contentPane.add(new JLabel("Lacre 6:"));
        contentPane.add(txtLacre6);
        contentPane.add(new JLabel("Lacre 7:"));
        contentPane.add(txtLacre7);

        atualizaCamposLacre(0);

        txtQuantidade.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                digitouAlgoNoTxtQuantidade();
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                digitouAlgoNoTxtQuantidade();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                digitouAlgoNoTxtQuantidade();
            }
        });
    }

    private void digitouAlgoNoTxtQuantidade() {
        int quantidade = 0;
        try {
            quantidade = Integer.parseInt(txtQuantidade.getText());
        } catch (NumberFormatException e) {
            // não digitou uma quantidade válida, ignorar
        }
        atualizaCamposLacre(quantidade);
    }

    private void atualizaCamposLacre(int quantidade) {
        Exemplo objetoPai = this;
        Class<JTextField> tipoDoAtributo = JTextField.class;
        for (int i = 1; i <= 36; i++) {
            String nomeDoAtributo = "txtLacre" + i;
            JTextField textField = Reflector.findAttributeByName(nomeDoAtributo, tipoDoAtributo, objetoPai);
            if (textField != null) {
                boolean habilita = i <= quantidade;
                textField.setEnabled(habilita);
                if (habilita) {
                    textField.setBackground(Color.GREEN);
                } else {
                    textField.setBackground(Color.GRAY);
                }
            }
        }
    }
}

Executando:

Sem digitar nada:

Digitando 1:

Digitando 4:

Se você não conseguir, posta o código de sua tela.

Staroski, Está dando um referente ao Reflector.

Removi essas linha

        if (textField != null) {
            boolean habilita = i <= quantidade;
            textField.setEnabled(habilita);
            if (habilita) {
                textField.setBackground(Color.GREEN);
            } else {
                textField.setBackground(Color.GRAY);
            }

e o código rodou, porem sem as funcionalidade, está gerando o erro ao declarar habilita como booleana.

Mano staroski, quebrei a cabeça aqui e deu certo mano. valeu pela ajuda, Deus abençoe vc e a sua família, abraço e até a próxima duvida kkkkkkkk.

1 curtida