Dúvida sobre o escopo de variáveis

1 resposta
R

Depois de criar vários pequenos programas em linha de comando resolvi me aventurar pela primeira vez em uma aplicação “windowed”. Não sei se minha dúvida é exatamente em relação ao escopo das variáveis, mas enfim, vou colocar aqui o código que eu fiz e depois colocar a minha dúvida:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame{

    /*Declaração das variáveis*/
    JTextField texto;
    JButton btnAdicionar;
    JList listaNomes;
    DefaultListModel listaItems;
    
    public Main(){

        super("My first Java program");
        Container tela = getContentPane();
        setLayout(null);        

        /*Cria os componentes*/
        texto = new JTextField(50);
        texto.setBounds(8, 8, 225, 21);
        btnAdicionar = new JButton("Adicionar item");
        btnAdicionar.setBounds(8, 40, 225, 33);
        listaItems = new DefaultListModel();
        listaNomes = new JList(listaItems);
        listaNomes.setVisibleRowCount(10);
        JScrollPane painelRolagem = new JScrollPane(listaNomes);
        listaNomes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        painelRolagem.setBounds(8, 88, 225, 145);

        /*Adiciona o código do botão*/
        btnAdicionar.addActionListener(
           new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if (texto.getText().trim().equals("")) {
                    JOptionPane.showMessageDialog(null, "Digite o texto desejado!");
                    texto.setText("");
                    texto.requestFocus();
                } else {
                    listaItems.addElement(texto.getText());
                    listaNomes.repaint();
                }
            }
           }
        );

        /*Adiciona os componentes à tela*/
        tela.add(texto);
        tela.add(btnAdicionar);
        tela.add(painelRolagem);

        /*Exibe a janela*/
        setSize(253, 274);
        setLocationRelativeTo(null);
        setVisible(true);        
    }
    
    public static void main(String[] args) {
        Main app = new Main();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

Como podem ver é simplesmente um programa para adicionar em um JList um item com o texto do JTextField.
O que eu notei é que coloquei a variável listaItems fora do construtor da classe. Não seria melhor que ela fosse declarada dentro do construtor? O problema é que dessa forma eu precisaria de um método que me retornasse um array de todos os items do JList (independente de estarem selecionados ou não) e não encontrei isso.

Minha idéia foi a seguinte: no código do botão declarar uma variável do tipo DefaultListModel. Ela em seguida recebe todos os itens do JList. O código insere o item e termina a execução do botão. Com isso a variável já seria liberada ao final da execução do código do botão, não é? E aí eu não precisaria inicializá-la no construtor propriamente dito. Poderia criar o JList para:

listaNomes = new JList(); /sem a lista/

O que acham? Grato pelas opiniões!

t+!

1 Resposta

renatoes

Boa noite rvlira,

Se você declarar sua variável (exceto que ela seja private static) dentro de qualquer método, elas existirão somente dentro do escopo deste método.
Um exemplo:

public void doA()
{
     int a; //a variável a declara no método  existe dentro do escopo deste método
}

Lembrando: em Java você não pode declarar uma variável static dentro de um método, conforme discutido aqui: http://www.velocityreviews.com/forums/t135242-static-local-variables-not-allowed-in-java-.html

EDIT:
Alguns links:
www.cse.ucsc.edu/classes/cmps012a/Winter03-01/notes/Lecture27-4perpage.pdf

[ ]'s

Criado 11 de fevereiro de 2008
Ultima resposta 12 de fev. de 2008
Respostas 1
Participantes 2