Criei uma aplicação que trabalha com gráficos usando JFreeChart onde após construir o gráfico gero um JPanel, que não sei onde colocar na minha aplicação…
Qual componente swing que contem um JPanel?[size=18] [/size]
Criei uma aplicação que trabalha com gráficos usando JFreeChart onde após construir o gráfico gero um JPanel, que não sei onde colocar na minha aplicação…
Qual componente swing que contem um JPanel?[size=18] [/size]
Pode colocar em um JFrame, JDialog, JTabbedPane, em outro JPanel. Depende do que quer fazer com o painel.
dentro de uma janela tenho um pequeno espaço onde pretendo colocar o gráfico, o mais preferível era colocar o JPanel gerado no lugar do JPanel pré-definido em tamanho e localização, Seria possível? Qual código eu utilizaria para colocar um JPanel em outro ou similar?
Para adicionar usa o método add.
Aí dependendo do layout manager pode ser necessário passar uma constraint também. Qual layout está usando?
adicionei como você me descreveu mas ele não apareceu quando accionei o botão…
teria de fazer algum tipo de refresh no panel anterior?
O painel é adicionado em tempo de execução? Tente chamar revalidate após adicioná-lo.
panel.add(painelComGrafico);
panel.revalidate();
teria como me dar exemplo de um JPanel em um outro JPanel que recebe um JPanel?
-----------------------------------
| JPanelPrincipal |
| | -----------------------------
| ---------------------- | | JPanelGraficoConstruido |
| | JPanelGrafico | | -----------------------------
| | | |
| ---------------------- |
----------------------------------|
Colocar o JPanelGraficoConstruido no JPanelGrafico.
Como definir o tamanho de cada um e como incluir o grafico.
Para definir posicionamento tem que usar Layout Managers.
Você está usando alguma ferramenta para fazer as telas, como o net beans ou visual editor, ou está fazendo as telas na mão?
Poste o código que não está dando certo.
Vai um exemplo com três JPanels, um dentro do outro. Para facilitar a visualização, cada um está com um cor diferente.
[code]import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Janela extends JFrame {
JPanel p1;
JPanel p2;
JPanel p3;
public Janela() {
super("Janela cheia de painéis");
initialize();
}
private void initialize() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(getP1()); // Seta p1 como content pane do frame
pack();
}
private JPanel getP1() { // Retorna p1
if (p1 == null) {
p1 = new JPanel();
p1.setBackground(Color.YELLOW);
p1.setPreferredSize(new Dimension(400, 300));
p1.add(getP2()); // Adiciona p2 dentro de p1
}
return p1;
}
private JPanel getP2() { // Retorna p2
if (p2 == null) {
p2 = new JPanel();
p2.setBackground(Color.ORANGE);
p2.setPreferredSize(new Dimension(300, 250));
p2.add(getP3()); // Adiciona p3 dentro de p2
}
return p2;
}
private JPanel getP3() { // Retorna p3
if (p3 == null) {
p3 = new JPanel();
p3.setBackground(Color.RED);
p3.setPreferredSize(new Dimension(200, 200));
}
return p3;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Janela().setVisible(true);
}
});
}
}[/code]
no JPanel principal:
private void geraGraficos() {
panGraficoDeGastos.add(FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos));
}
[code]panGraficoDeGastos.setName(“panGraficoDeGastos”); // NOI18N
javax.swing.GroupLayout panGraficoDeGastosLayout = new javax.swing.GroupLayout(panGraficoDeGastos);
panGraficoDeGastos.setLayout(panGraficoDeGastosLayout);
panGraficoDeGastosLayout.setHorizontalGroup(
panGraficoDeGastosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 353, Short.MAX_VALUE)
);
panGraficoDeGastosLayout.setVerticalGroup(
panGraficoDeGastosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 247, Short.MAX_VALUE)
);[/code]
[code]javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(btmLimpaCampos)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btmLimpaTabela)
.addGap(67, 67, 67)
.addComponent(btmMudaSenhaAdministrador)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 597, Short.MAX_VALUE)
.addComponent(btmBusca))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtDataInicial, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtDataFinal, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(76, 76, 76)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(txtSenha, javax.swing.GroupLayout.DEFAULT_SIZE, 415, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(359, 359, 359)
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblTotalSelecionado, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE))))))
.addGroup(layout.createSequentialGroup()
.addGap(408, 408, 408)
.addComponent(jLabel13))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(410, 410, 410)
.addComponent(jLabel12))
.addGroup(layout.createSequentialGroup()
.addGap(25, 25, 25)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 791, Short.MAX_VALUE))))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblTotalCreditos, javax.swing.GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel9)
.addGap(23, 23, 23)
.addComponent(lblSaldo, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE))
.addComponent(btmSomaTotalSelecionado, javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel7)
.addGap(10, 10, 10)
.addComponent(lblTotalDebitos, javax.swing.GroupLayout.DEFAULT_SIZE, 227, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 214, Short.MAX_VALUE)
.addComponent(btmAtualizaSaldo)
.addGap(111, 111, 111))
.addComponent(panGraficoDeGastos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panGraficoDeEntradaESaida, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(jLabel5)
.addComponent(txtDataInicial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(txtDataFinal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel4)
.addComponent(txtSenha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(17, 17, 17)
.addComponent(jLabel13)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE)
.addGap(0, 0, 0)
.addComponent(jLabel12)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel6, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(lblTotalSelecionado, javax.swing.GroupLayout.Alignment.TRAILING))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btmSomaTotalSelecionado, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(43, 43, 43)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblTotalDebitos)
.addComponent(jLabel7))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel8)
.addComponent(lblTotalCreditos))
.addGap(24, 24, 24)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblSaldo)
.addComponent(jLabel9))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btmAtualizaSaldo)
.addGap(18, 18, 18)
.addComponent(panGraficoDeEntradaESaida, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(panGraficoDeGastos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btmLimpaCampos)
.addComponent(btmLimpaTabela)
.addComponent(btmMudaSenhaAdministrador)
.addComponent(btmBusca))
.addContainerGap())
);
pack();[/code]
Classe de construcao do grafico:
[code]/*
import java.awt.Dimension;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JPanel;
import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
/**
*
@author david
*/
class Tipo implements Comparable<String> {
public int compareTo(String o) {
throw new UnsupportedOperationException(“Not supported yet.”);
}
}
public abstract class FabricaDeGraficos {
static private List<Double> valores = new ArrayList<Double>();
static private List<String> tipos = new ArrayList<String>();
static private List<String> datas = new ArrayList<String>();
public static void addItem(Double valor, String tipo, String data) {
valores.add(valor);
tipos.add(tipo);
datas.add(data);
}
public static JPanel criaGraficoDeGastos(Double totalSelecionado, Double debitosTotais, Double creditosTotais) throws FileNotFoundException, IOException {
DefaultPieDataset pds = new DefaultPieDataset();
pds.setValue("Debitos Selecionados", totalSelecionado);
pds.setValue("Outros Debitos", (debitosTotais - totalSelecionado));
pds.setValue("Saldo Disponível", (creditosTotais - debitosTotais));
JFreeChart grafico = ChartFactory.createPieChart3D("Balancete em relaçao ao saldo",
pds,
true,
true,
false);
PiePlot3D piePlot = (PiePlot3D) grafico.getPlot();
piePlot.setBackgroundPaint(ChartColor.LIGHT_GRAY); //cor de fundo do grafico
piePlot.setSectionPaint("Debitos Selecionados", ChartColor.ORANGE); // cor amarela da secao com chave nome Selecionados
piePlot.setSectionPaint("Outros Debitos", ChartColor.RED);
piePlot.setSectionPaint("Saldo Disponível", ChartColor.BLUE);
piePlot.setSectionOutlinesVisible(false); //linha externa das secoes nao visivel
piePlot.setIgnoreZeroValues(true); //ignora secoes de valor 0
piePlot.setLabelBackgroundPaint(ChartColor.BLACK); // cor de fundo das etiquetas
piePlot.setLabelPaint(ChartColor.WHITE); // cor do texto nas etiquetas
piePlot.setDepthFactor(0.20F);
//grava em arquivo
FileOutputStream fos = new FileOutputStream("graficosPNG/grafico.png");
ChartUtilities.writeChartAsPNG(fos, grafico, 200, 200);
fos.close();
JPanel painel = new ChartPanel(grafico);
painel.setPreferredSize(new Dimension(200, 200));
return painel;
}
public static JPanel criaGraficosDeEntradaESaida() {
// ordena por insercao as datas
/* for (int i = 1, j; i < datas.size(); i++) {
j = i - 1;
while (Data.diaDoSeculo(datas.get(i)) < Data.diaDoSeculo(datas.get(j)) && j >= 0) j--;
datas.add(j + 1, datas.get(i));
valores.add(j + 1, valores.get(i));
tipos.add(j + 1, tipos.get(i));
}
*/
DefaultCategoryDataset dcd = new DefaultCategoryDataset();
Iterator itTipos = tipos.iterator();
Iterator itDatas = datas.iterator();
Iterator itValores = valores.iterator();
while (itValores.hasNext()) {
Double valor = (Double) itValores.next();
String tipo = (String) itTipos.next();
String data = (String) itDatas.next();
System.out.println(valor + "\n" + tipo + "\n" + data);
dcd.addValue(valor, tipo, data);
}
valores.clear();
tipos.clear();
datas.clear();
JFreeChart graficoDeLinhas = ChartFactory.createLineChart(
"Balancete de entrada e Saída",
"Datas",
"Quantidade de Dinheiro (R$)",
dcd,
PlotOrientation.VERTICAL,
true,
true,
false);
CategoryPlot plot = (CategoryPlot) graficoDeLinhas.getPlot();
plot.setBackgroundPaint(ChartColor.lightGray);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
plot.setDomainGridlinePaint(ChartColor.white);
plot.setRangeGridlinePaint(ChartColor.white);
CategoryItemRenderer renderer = plot.getRenderer();
renderer.setSeriesPaint(0, ChartColor.BLUE);
renderer.setSeriesPaint(1, ChartColor.RED);
renderer.setSeriesPaint(2, ChartColor.BLACK);
return new ChartPanel(graficoDeLinhas);
}
}
[/code]
Pelo jeito esse código é do net beans. Então, o método que deveria adicionar o gráfico é este:
private void geraGraficos() {
panGraficoDeGastos.add(FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos));
}
Já verificou se o JPanel está sendo gerado corretamente?
Se este método está sendo chamado por um evento em tempo de execução, tente colocar o revalidate após adicioná-lo.
private void geraGraficos() {
panGraficoDeGastos.add(FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos));
panGraficoDeGastos.revalidate();
}
Testei e o JPanel esta sendo gerado corretamente.
usei o revalidate e continua sem funcionar.
Mais alguma sugestão?
Qual o problema? Não está aparecendo nada?
Pode ser pelo tamanho também. Qual é o preferred size do JPanel criado?
Você também pode definir o layout do JPanel como Border, assim o que for adicionado no CENTER dele se redimensiona. Mas só vai funcionar se o problema for o tamanho.
Não aparece nada de novo no painel, quero lembrar que o painel do gráfico gerado é adicionado em tempo de execução, creio que o problema não é o tamanho já que pré-defini antes de retornar na função que gera o painel como pode ver:
JPanel painel = new ChartPanel(grafico);
painel.setPreferredSize(new Dimension(200, 200));
fiz um teste tentando adicionar um painel vazio com cor de fundo e tanho definidos e descobri que o painel não está sendo adicionado em tempo corrente.
teste sem resposta:
JPanel painel = new JPanel();
painel.setPreferredSize(new Dimension(200, 200));
painel.setBackground(Color.red);
panGraficoDeGastos.add(painel);
Como adicionar um componente a um painel em tempo corrente? :?
Quando se usa o método add em um container que está visível, é preciso chamar o método revalidate. Esta especificado no javadoc: http://download.oracle.com/javase/6/docs/api/java/awt/Container.html#add%28java.awt.Component%29
JPanel painel = new JPanel();
painel.setPreferredSize(new Dimension(200, 200));
painel.setBackground(Color.red);
panGraficoDeGastos.add(painel);
panGraficoDeGastos.revalidate();
usei o revalidate e ainda não foi adicionado o painel!
tambem tentei adicionar outro tipo de componente como um JLabel e não tive resposta:
[code] JLabel lblGraficoDeGastos = new JLabel();
FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos);
lblGraficoDeGastos.setIcon(new ImageIcon(“graficosPNG/grafico.png”));
panGraficoDeGastos.add(lblGraficoDeGastos);
panGraficoDeGastos.revalidate();[/code]
Eu não sei configurar o GroupLayout na mão, mas pode estar faltando passar alguma informação para o layout.
Faz o seguinte, muda o layout de panGraficoDeGastos. Para testar, pode usar o BorderLayout, que vai ajeitar seu painel no tamanho de panGraficoDeGastos.
Muito Obrigado pela ajuda Eric!
Agora funciona perfeitamente.