Olá a todos. Eu quero fazer um programa que mostre o nome a quantidade de votosm que cada candidato recebeu, e mostre o percnetual dentro de um gráfico através do JFreeChart. So que eu não estou acertado passar o objeto instanciado pra o objeto gerador de gráfico da classe gráfico. Como isso se faz, fazendo como estou agora não aparece nenhum aviso de erro, mas quando compila aparece: Exception in thread “main” java.lang.NullPointerException. Qual será o erro?
Aqui o codigo:
public class Grafico extends JFrame implements Serializable{
public DefaultPieDataset dados(Pretendentes p) throws IOException{
DefaultPieDataset votos= new DefaultPieDataset ();
for(int i=0;i<p.aspirantes.size();i++) {
votos.setValue(p.aspirantes.get(i).nome, p.aspirantes.get(i).getNum());}
return votos;
}
public void salvar(JFreeChart molde) throws IOException {
FileOutputStream registro = new FileOutputStream("result.jpg");
ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);
}
public ChartFrame painel(DefaultPieDataset votos) throws IOException {
JFreeChart molde = ChartFactory.createPieChart("Resultado da eleição", votos);
ChartFrame forma = new ChartFrame("", molde);
salvar(molde);
add(forma);
return forma;
}
public Grafico() throws IOException {
setSize(950,720);
setTitle("GRÁFICO PIZZA");//Nome do gráfico
painel(dados(null));
setVisible(true);
}
public Grafico retorno() throws IOException {
return new Grafico();
}
}
//===========>>>>>>>CLASSE PRINCIPAL==>>
public class Principal implements Serializable {
public static void main(String[] args) throws IOException {
Scanner l = new Scanner(System.in);
Pretendentes p = new Pretendentes();
int m = 5;
Grafico g = new Grafico();
do {
Candidato c = new Candidato();
System.out.println("1 - cadastrar candidato:"+ "2 - listar candidatos"+ "3 - mostrar grafico");
m = l.nextInt();
switch(m) {
case 1: System.out.println("informe nome e numero de votos");
c.setNome(l.next());
c.setNum(l.nextInt());
p.adicionar(c);
break;
case 2:try {
p.listar();}catch(Exception e){
System.out.println("não tem nenhum candidato");}
break;
case 3: g.retorno();
break;
case 0: try {s.incluir(p);
System.out.println("Volte sempre que quiser!");
}catch(Exception e){System.out.println("nao deu pra salvar");}
break;
default: System.out.println("opcao invalida veva menu: ");
}
}while(m != 0);
}
Nas linhas onde tem:
Grafico g = new Grafico();
painel(dados(null));
for(int i=0;i<p.aspirantes.size();i++);
Esse for é o que mais me preocupa, porque parece que o parâmetro recebido é vazio, meu principal problema é pegar o objeto instanciado “p”, e coloca-lo na classe Gráfico, lembrando que Pretendentes é so um arrayList de Candidado, que tem nome e qtde de votos
Se o erro é nesta linha, só pode ser causado por um problema na execução do método painel (que nome horrível para um método, parece-me maus um atributo).
E você mesmo é o causador deste problema, ao passar null como parâmetro para os dados.
Aqui você precisa passar o Dataset com os intervalos de dados.
Entendi, no lugar de ChartFrame o certo é ChartPanel, bem, quanto ao parametro de pretendentes, eu usei padrão Singleton na classe, e ficou quase certo, o único prblema é que o gráfico continua vazio:
public class Grafico extends JFrame implements Serializable{
Pretendentes p2 = Pretendentes.getInstancia();
public JFreeChart dados( ) throws IOException{
DefaultPieDataset votos= new DefaultPieDataset ();
String nome;
int qtde;
for(int i=0;i<p2.aspirantes.size();i++) {
nome = p2.aspirantes.get(i).nome;
qtde = p2.aspirantes.get(i).num;
votos.insertValue(i, nome, qtde);
}
JFreeChart molde = ChartFactory.createPieChart(“Resultado da eleição”, votos);
return molde;
}
public void salvar(JFreeChart molde) throws IOException {
FileOutputStream registro = new FileOutputStream("Tabela_de_result.png");
ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);
}
public ChartPanel painel(JFreeChart molde) throws IOException {
ChartPanel coisa = new ChartPanel(molde);
salvar(molde);
getContentPane().add(coisa);
return coisa;
}
public Grafico() throws IOException {
setLocationRelativeTo(null);//Faz com que o gráfico, quando aberto,
//apareça no meio, e não na parte superior, sem ele
setSize(950,720);
setTitle("GRÁFICO PIZZA");
painel(dados());
setVisible(true);
}
public void mostrar() throws IOException {
new Grafico();
ok, eu tentei esses dois modelos de for um de cada vez, mas ambos mostram a mesma coisa:
String nome; int qtde;
for(Candidato c: p2.aspirantes) {
nome = c.getNome();
qtde = c.getNum();
votos.setValue(nome, qtde);
}
Deixa eu entender o que chega até esse ponto do código.
Para apresentar o gráfico de pizza, você precisa ter os dados já consolidados, por exemplo, você tem 4 candidados:
João - 200 votos
José - 140 votos
Anna - 210 votos
Maria - 50 votos
Total: 500 votos
Para cada candidato, os totais de votos já estão contados. É isso que acontece nesse ponto?
mostra os respectivos dados perfeitamente, aí é que tá, que tipo de biblioteca é essa que não mostra dados oriundos de polimorfismo? Como vou aplicar isso num sistema? Será que POSSO fazer isso?
O objetivo era eu fazer um array de nomes e qtde de votos e exibir um grafico desse array
Se os dados forem passados corretamente, funciona, caso haja erro, não vai funcionar mesmo.
E quem tem que garantir que os dados são passados de maneira correta é você.
Printa os dados que você está passando no loop e tentando inserir no DefaultPieDataset
assim tbm funciona, só pode ser algum erro na transmissão de dados entre classes, e olhe que eu usei SINGLETON(aprendi isso com meu professor de LPOO II neste sábado agora)
Consegui finalizar o meu progama com sucesso, valeu, na verdade o problema mesmo era fazer com que os dados salvos chegassem á classe grafico, bem na verdade a solução não foi bem o que eu tinha em mente, e provavelemente eu nem preciso do método singleton nele, mas funcionou, um gráfico ligado automaticamente a lista de candidatos cadastrados. Obrigado pelas dicas, e aqui como funciona:
public class Grafico extends JFrame implements Serializable{
Salvando s = new Salvando();
Pretendentes p2 = s.trazer();
public Grafico() throws IOException {
setLocationRelativeTo(null);//Faz com que o gráfico, quando aberto,
//apareça no meio, e não na parte superior, sem ele
setSize(950,720);
setTitle("GRÁFICO DA ELEIÇÃO");
int x = p2.aspirantes.size();
System.out.println("nós temos de candidatos::" + x );
painel(dados());
setVisible(true);
}
public JFreeChart dados( ) throws IOException{
DefaultPieDataset votos= new DefaultPieDataset ();
String nome ;
int qtde ;
for(int i=0;i<p2.aspirantes.size();i++) {
nome = p2.aspirantes.get(i).nome;
qtde = p2.aspirantes.get(i).num;
votos.setValue(nome, qtde); }
JFreeChart molde = ChartFactory.createPieChart(“Resultado da eleição”, votos);
return molde;
}
public void salvar(JFreeChart molde) throws IOException {
FileOutputStream registro = new FileOutputStream("Tabela_de_result.png");
ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);
registro.close();
}
public ChartPanel painel(JFreeChart molde) throws IOException {
ChartPanel coisa = new ChartPanel(molde);
salvar(molde);
getContentPane().add(coisa);
return coisa;
}
public void mostrar() throws IOException {
new Grafico();
}
}
public class Principal implements Serializable {
public static void main(String[] args) throws IOException {
Salvando s = new Salvando();//Classe Seriable
Scanner l = new Scanner(System.in);
Pretendentes p = Pretendentes.getInstancia();
Grafico g = new Grafico();
int m = 5;
try {
Pretendentes p3 = null;
p3 = s.trazer();
p = p3;
}catch(Exception e){
System.out.println("problema de trazimento");
}
do {
Candidato c = new Candidato();
System.out.println("1 - cadastrar candidato: \n"
+ "2 - listar candidatos \n"
+ "3 - mostrar grafico ");
;
m = l.nextInt();
switch(m) {
case 1: System.out.println("informe nome e numero de votos");
c.setNome(l.next());
c.setNum(l.nextInt());
p.adicionar(c);
s.incluir(p4);
break;
case 2:try {
p4.listar();
//p.listar();
}catch(Exception e){
System.out.println("não tem nenhum candidato");
}
break;
case 3: g.mostrar();
break;
case 0: try {
s.incluir(p);
System.out.println("Volte sempre que quiser!");
}catch(Exception e){
System.out.println("nao deu pra salvar");
}
break;
default: System.out.println("opcao invalida veva menu: ");
}
}while(m != 0);
}