Instantiated object does not appear in function

Asked

Viewed 183 times

1

Hello, I am creating a Java project using Eclipse with windowbuilder. Inside this project I have Jframe with the objects, jbuttons, jtextfields, jformattedtextfields, etc... I have all these objects in my project. It turns out that when I try to create a function at the beginning of the code to give actions to these objects, these objects do not appear in the functions. It’s like they don’t exist. I can’t create functions, methods, actions for these objects because they don’t appear in the functions. Does anyone know why this happens... ?

Here are the instantiated objects:

        JTextPane PEQuestion = new JTextPane();
        PEQuestion.setText("1) Ao fazer compras no supermercado:");
        PEQuestion.setBounds(10, 280, 599, 48);
        Question.add(PEQuestion);

JTextPane peTextA = new JTextPane();
        peTextA.setText("A) Compro tudo que tenho vontade, sem prestar aten\u00E7\u00E3o no pre\u00E7o, na marca ou na embalagem;");
        peTextA.setBounds(34, 339, 540, 48);
        Question.add(peTextA);
        
        JTextPane peTextB = new JTextPane();
        peTextB.setText("B) Uso apenas o pre\u00E7o como crit\u00E9rio de escolha;");
        peTextB.setBounds(34, 395, 540, 48);
        Question.add(peTextB);

    JTextPane peTextC = new JTextPane();
    peTextC.setText("C) Presto aten\u00E7\u00E3o se os produtos de uma determinada marca s\u00E3o ligados a alguma empresa que n\u00E3o respeita o meio ambiente ou quest\u00F5es sociais;");
    peTextC.setBounds(34, 449, 540, 48);
    Question.add(peTextC);
    
    JTextPane peTextD = new JTextPane();
    peTextD.setText("D) Procuro considerar pre\u00E7o e qualidade, al\u00E9m de escolher produtos que venham em embalagens recicl\u00E1veis e que respeitem crit\u00E9rios ambientais e sociais.");
    peTextD.setBounds(34, 504, 540, 48);
    Question.add(peTextD);

And here the functions that I try to create with the objects (at the beginning of the class), and that do not identify the objects:

public void mudarTexto()

{
    PEQuestion.setText("2) Entre os alimentos que normalmente você consome, que quantidade é pré-preparada, embalada ou importada?");
    peTextA.setText("A) Quase todos;");
    peTextB.setText("B) Metade;");
    peTextC.setText("C) Um quarto;");
    peTextD.setText("D) Muito poucos. A maior parte dos alimentos que consumo não é pré-preparada nem embalada, tem origem orgânica e é produzida na região onde vivo.");
    PEImg.setIcon(new ImageIcon(mainView.class.getResource("/peImages/02.png")));
}

The error that appears is:

Pequestion cannot be resolved

peTextA cannot be resolved

peTextB cannot be resolved

peTextC cannot be resolved

peTextD cannot be resolved

Thank you.

  • They exist only in the scope in which they are instantiated, correct?

  • Why not declare controls in a wider scope, such as the class? class MinhaJanela extends JPanel { private JTextPane PEQuestion; /* mais abaixo */ public void metodoQueEuQueroTanto() { PEQuestion = new JTextPane(); } /* mais abaixo */ public void metodoQueEuQueroMais() { PEQuestion.setText("minha questão"); } }

  • The objects are within the constructor method and the functions before the constructor method.

  • I did not understand. How so declare in a wider scope?

  • The scope of an if block is the if block itself. The scope of a method is the method itself, including the various ifs blocks that perhaps exist within it. The scope of the class is all methods within the class, and all ifs blocks of all methods.

2 answers

1

You have a scope problem. When you declare new variables in a method, they only belong to that method. If you want a variable to be accessed by all methods of a class, you have to declare (if you want you can also initialize) it in the class body, outside of the methods. In your case, you must be wanting something like this:

public class MinhaClasse {

    // Variáveis declaradas no escopo da classe podem 
    // ser acessadas em qualquer método
    JTextPane peQuestion = new JTextPane(); //Nome de variável deve ser CamelCase
    JTextPane peTextA = new JTextPane();
    JTextPane peTextB = new JTextPane();
    JTextPane peTextC = new JTextPane();
    JTextPane peTextD = new JTextPane();

    public MinhaClasse() {

        // As variáveis usadas aqui são as que pertencem a classe
        peQuestion.setText("1) Ao fazer compras no supermercado:");
        peQuestion.setBounds(10, 280, 599, 48); Question.add(peQuestion);

        peTextA.setText("A) Compro tudo que tenho vontade, sem prestar aten\u00E7\u00E3o no pre\u00E7o, na marca ou na embalagem;");
        peTextA.setBounds(34, 339, 540, 48); Question.add(peTextA);

        peTextB.setText("B) Uso apenas o pre\u00E7o como crit\u00E9rio de escolha;");
        peTextB.setBounds(34, 395, 540, 48); Question.add(peTextB);

        peTextC.setText("C) Presto aten\u00E7\u00E3o se os produtos de uma determinada marca s\u00E3o ligados a alguma empresa que n\u00E3o respeita o meio ambiente ou quest\u00F5es sociais;");
        peTextC.setBounds(34, 449, 540, 48); Question.add(peTextC);

        peTextD.setText("D) Procuro considerar pre\u00E7o e qualidade, al\u00E9m de escolher produtos que venham em embalagens recicl\u00E1veis e que respeitem crit\u00E9rios ambientais e sociais.");
        peTextD.setBounds(34, 504, 540, 48);
        Question.add(peTextD);
    }

    public void mudarTexto() {

        // As variáveis usadas aqui são as que pertencem a classe
        peQuestion.setText("2) Entre os alimentos que normalmente você consome, que quantidade é pré-preparada, embalada ou importada?");
        peTextA.setText("A) Quase todos;");
        peTextB.setText("B) Metade;");
        peTextC.setText("C) Um quarto;");
        peTextD.setText("D) Muito poucos. A maior parte dos alimentos que consumo não é pré-preparada nem embalada, tem origem orgânica e é produzida na região onde vivo.");
        PEImg.setIcon(new ImageIcon(mainView.class.getResource("/peImages/02.png")));
    }

    //Exemplo de acesso de variáveis em determinados escopos
    public void outroEscopo() {

         JTextPane peTextA = new JTextPane();
         peTextA.setText("Eu pertenço APENAS ao escopo desse método");

         // Se você tiver em um método alguma variável com o mesmo
         // nome de alguma variável que pertença ao escopo da classe
         // basta usar o THIS para acessar a variável da classe

         this.peTextA.setText("Eu pertenço ao escopo da classe");
    }
}

Obs.: Keep an eye on the messages in the IDE, as unless you don’t have any lines set up, the IDE always warns you about these types of scoping issues before you even compile the code.

0

If you declare

class MinhaClasse
{
    public void MinhaOperacao(int meuParametro)
    {
        if (meuParametro % 2 == 0)
        {
            JTextPane PEQuestion = new JTextPane();
        }

        PEQuestion.setText("teste 1");
    }
}

it will give the same error. Why? Because PEQuestion not declared in line scope PEQuestion.setText("teste 1");.

What to do?

If you want to use PEQuestion throughout the class, it is sufficient to declare it within the scope of the class,

class MinhaClasse
{
    private JTextPane PEQuestion;

    public MinhaClasse()
    {
        PEQuestion = new JTextPane();
    }

    public void MinhaOperacao(int meuParametro)
    {
        if (meuParametro % 2 == 0)
        {
            PEQuestion.setText("teste 2");
        }
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.