Inserir um ArrayList em um JPanel

6 respostas
D

Boa noite pessoal.
Estou com uma dúvida que acredito ser bem básica.
Eu precisava inserir um ArrayList em um JPanel ou direto no Frame mesmo, não sei qual é o certo.
Se vocês quiserem eu posso colocar o trecho do código que estou tentando fazer mas como eu acho que é muito mais uma dúvida de conceito(e básico) eu gostaria só de um exemplo mesmo ou de uma orientação de como eu posso fazer isso, ou como devo prosseguir.

6 Respostas

L

O que contém no arrayList? Strings?
Se sim…sugiro criar um JTextArea, para adicionar o texto contido no arrayList…
Ou criar vários labels , um para cada posição do arrayList
Ou senão ainda, criar textFields…enfim…tem que utilizar um componente que mostre textos na tela

E então somente depois adicionar este ou estes componentes no JPanel

D

É uma ArrayList de String.
Na verdade esta ArrayList contem o conteudo de um JTextArea que ela esta armazenando.
Mas acho que entendi, não tem como colocar o conteudo direto no JPanel?
eu preciso colocar em um outro componente primeiro é isso?
Vou fazer um teste.

D

Então galera, ainda não consegui, tem alguma coisa que esta bloqueando minhas ideias, acho que ainda não entendi esta parte do estudo rsrs...
O que acontece é o seguinte
Eu precisava inserir na tela inicial do meu sistema um Panel, Label ou Frame com os dados de uma ArrayList que estou capturando em outra tela.
Não sei se minha explicação ficou confusa ou da p entender?

Esse é o código da minha tela inicial onde eu queria colocar a ArrayList

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

// classe com a tela inicial, botões para incluir jogo e lista os jogos

public class EstruturaDeTela {
	JFrame frame;
	JPanel panel1, panel2, panel3;
	JLabel label;
	JButton novoJogo, listaDeJogos;
	TelaNomeJogo start = new TelaNomeJogo();
	

	public void telaInicial() {
		frame = new JFrame();
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel3 = new JPanel();
		
		label = new JLabel("Sistema de cadastro de Jogos - XBOX 360");
		
		novoJogo = new JButton("novo jogo");
		listaDeJogos = new JButton("lista de jogos");
		
		novoJogo.addActionListener(new NovoJogo());
		listaDeJogos.setBounds(1100, 300, 1200, 250);
		
		panel1.add(label);
		panel2.add(novoJogo);
		panel2.add(listaDeJogos);
		panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
		
		frame.getContentPane().add(BorderLayout.NORTH, panel1);
		frame.getContentPane().add(BorderLayout.WEST, panel2);
		frame.setSize(750, 500);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	
	class NovoJogo implements ActionListener{
		public void actionPerformed(ActionEvent event){
			start.insiraNome();
		}
	}
}

E este é o código da classe que carrega o ArrayList

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

//classe que será executada ao clicar no botao novo jogo da classe estrutura de tela

public class TelaNomeJogo {
	JFrame frame;
	JPanel panel1, panel2;
	JButton incluir, cancelar;
	JLabel label;
	JTextField field;
	TelaNotasJogo start = new TelaNotasJogo();
	ArrayList<String> jogos = new ArrayList<String>();
	
	
	public void insiraNome(){
		frame = new JFrame();
		panel1 = new JPanel();
		panel2 = new JPanel();
		incluir = new JButton(" incluir ");
		cancelar = new JButton(" cancelar ");
		label = new JLabel(" Jogo : ");
		field = new JTextField(30);
		
		panel2.add(incluir);
		panel2.add(cancelar);
		panel1.add(label);
		panel1.add(field);
		incluir.addActionListener(new NotasJogo());
		
		
		frame.getContentPane().add(BorderLayout.CENTER, panel1);
		frame.getContentPane().add(BorderLayout.SOUTH, panel2);
		frame.setVisible(true);
		frame.setSize(450,120);
	}
	
	class NotasJogo implements ActionListener{
		public void actionPerformed(ActionEvent event){
			jogos.add(field.getText());
			JOptionPane.showMessageDialog(null, jogos + " inserido com sucesso, coloque as notas para finalizar o cadastro");
			start.insiraNotas();
		}
	}
}

É possivel fazer o que eu estou pensando ou estou indo pelo caminho errado?

wagnerfrancisco

Certamente é possível. Você precisa, na segunda tela, notificar a tela inicial de que um jogo foi inserido. Para isto, você precisa de uma referência à tela principal. Uma maneira direta (mas que vai gerar uma dependência forte entre as janelas) é a seguinte:

  1. Ao instanciar a classe TelaNomeJogo, passe uma referência da classe EstruturaDaTela no construtor. Algo semelhante a isto:
public class EstruturaDeTela {
   // demais variaveis
   TelaNomeJogo start = new TelaNomeJogo(this); //passando a referencia

   // restante da classe
}

public class TelaNomeJogo {
   JFrame frame;
   JPanel panel1, panel2;
   JButton incluir, cancelar;
   JLabel label;
   JTextField field;
   TelaNotasJogo start = new TelaNotasJogo();
   ArrayList<String> jogos = new ArrayList<String>();
   EstruturaDaTela estrutura; // referencia a tela principal

   public TelaNomeJogo(EstruturaDaTela estrutura) {
      //atribua no construtor a referencia.
   }
  1. Escreva um método na classe EstruturaDaTela que recebe a lista de strings e atualiza seu componente gráfico (uma lista, um label, um jtextarea, o que for). Quando o usuário clicar em incluir (após adicionar o novo jogo na lista), chame este método (você tem uma referência, fica fácil).

No caso, se você vai ter uma lista de jogos, pense na possibilidade de precisar selecioná-los e editar os nomes. Neste caso você provavelmente precisará de uma lista (um jtextarea não basta).

D

Muito Obrigado wagnerfranciso, o que vc postou me fez ir atras e pesquisar algumas coisas muito interessantes.
Porém como eu estou no inicio do meus estudos em java acho que não compreendi direito o que vc quis dizer .
eu precisei refazer meu projeto para tentar uma abordagem diferente que eu estou estudando, tenho a impressão de inclusive não ser a melhor.
Mas por enquanto é isso o que tenho.
Eu refiz as classses tentando fazer o que vc me sugeriu porem apresenta erro

a 1° classe esta assim :

// Classe de layout da pagina inicial
import java.awt.Component;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class TelaInicial {
	JFrame frame;
	JButton buttonNovoJogo;
	JButton buttonListaJogos;
	JLabel label;
	ArrayList<String> listaJogos = new ArrayList<String>();
	TelaNomeJogo start = new TelaNomeJogo(this);
	String exibeJogos = "";
	
	public TelaInicial(){
		buttonNovoJogo = new JButton("Novo Jogo");
		buttonListaJogos = new JButton("Lista de Jogos");
		frame = new JFrame();
		
		buttonNovoJogo.addActionListener(new NovoJogo());
		
		buttonNovoJogo.setBounds(20, 20, 150, 25);
		buttonListaJogos.setBounds(180, 20, 150, 25);
		frame.add(buttonNovoJogo);
		frame.add(buttonListaJogos);
		
		frame.setLayout(null);
		frame.setVisible(true);
		frame.setSize(700, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	class NovoJogo implements ActionListener{
		public void actionPerformed(ActionEvent event){
			start = new TelaNomeJogo(null);
		}
	}

	public void exibeListaJogos(ArrayList<String> jogos) {
		listaJogos = jogos;
		for(String jogo : listaJogos){
			exibeJogos += jogo + "\n";
		}
		label = new JLabel(exibeJogos);
	}
}
e a segunda :
import java.util.ArrayList;

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

// Classe para cadastro de um novo jogo

public class TelaNomeJogo{
	JFrame frame;
	JLabel label;
	JTextField field;
	JButton buttonInsereJogo;
	JButton buttonCancelar;
	ArrayList<String> jogos = new ArrayList<String>();
	String exibeJogos = "";
	TelaInicial telaInicial;
	
	public TelaNomeJogo(TelaInicial telaInicial){
		frame = new JFrame();
		label = new JLabel(" Insira um novo jogo : ");
		field = new JTextField(40);
		buttonInsereJogo = new JButton(" OK ");
		buttonCancelar = new JButton(" cancelar");
						
		label.setBounds(20, 20, 200, 20);
		field.setBounds(180, 20, 200, 20);
		buttonInsereJogo.setBounds(250, 70, 100, 25);
		buttonCancelar.setBounds(400, 70, 100, 25);
	
		buttonInsereJogo.addActionListener(new InsereNotas());
		
		frame.add(label);
		frame.add(field);
		frame.add(buttonCancelar);
		frame.add(buttonInsereJogo);
		
		frame.setLayout(null);
		frame.setVisible(true);
		frame.setSize(700, 200);
	}
	
	class InsereNotas implements ActionListener{
		public void actionPerformed(ActionEvent event){
			jogos.add(field.getText());
			telaInicial.exibeListaJogos(jogos);
		}
	}
	
	
}
O erro ocorre no metodo que tenta mostrar na tela a ArrayList
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at TelaNomeJogo$InsereNotas.actionPerformed(TelaNomeJogo.java:45)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Acho que o código está um tanto quanto um pouco bagunçado, se alguém puder me ajudar com o problema original ou quiser dar um toque boas praticas para melhorar o código ajudaria bastante.

wagnerfrancisco

Com este código você certamente obtém uma NullPointerException. Como o nome diz, esta exceção acontece quando você tenta invocar um método ou acessar um atributo de uma variável nula (que pode ter sido explicitamente setada como nula ou ainda não ter sido inicializada).

Na sua classe NovoJogo, você está passando null no construtor TelaNomeJogo. Como a TelaNomeJogo vai acessar a TelaInicial se você passou null? Você precisa passar uma referência da TelaInicial. Neste caso, pode utilizar TelaInicial.this ao invés de null.

Na sua classe TelaNomeJogo, no construtor, você precisa atribuir a telaInicial do construtor à variável da classe. Para isto:

this.telaInicial = telaInicial

É importante você ler sobre a linguagem Java para entender sobre estes conceitos. Um livro recomendado: Use a Cabeça: Java.

Criado 11 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 6
Participantes 3