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+!