Como adicionar um componente a um JPanel em tempo de execução? [RESOLVIDO]

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]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package contabilidade.recursos;

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&lt;Double&gt; valores = new ArrayList&lt;Double&gt;();
static private List&lt;String&gt; tipos = new ArrayList&lt;String&gt;();
static private List&lt;String&gt; datas = new ArrayList&lt;String&gt;();

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(&quot;Debitos Selecionados&quot;, totalSelecionado);
    pds.setValue(&quot;Outros Debitos&quot;, (debitosTotais - totalSelecionado));
    pds.setValue(&quot;Saldo Disponível&quot;, (creditosTotais - debitosTotais));

    JFreeChart grafico = ChartFactory.createPieChart3D(&quot;Balancete em relaçao ao saldo&quot;,
            pds,
            true,
            true,
            false);

    PiePlot3D piePlot = (PiePlot3D) grafico.getPlot();
    piePlot.setBackgroundPaint(ChartColor.LIGHT_GRAY); //cor de fundo do grafico
    piePlot.setSectionPaint(&quot;Debitos Selecionados&quot;, ChartColor.ORANGE); // cor amarela da secao com chave nome Selecionados
    piePlot.setSectionPaint(&quot;Outros Debitos&quot;, ChartColor.RED);
    piePlot.setSectionPaint(&quot;Saldo Disponível&quot;, 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(&quot;graficosPNG/grafico.png&quot;);
    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 &lt; datas.size(); i++) {
    j = i - 1;
    while (Data.diaDoSeculo(datas.get(i)) &lt; Data.diaDoSeculo(datas.get(j)) && j &gt;= 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 + &quot;\n&quot; + tipo + &quot;\n&quot; + data);
        dcd.addValue(valor, tipo, data);
    }

    valores.clear();
    tipos.clear();
    datas.clear();

    JFreeChart graficoDeLinhas = ChartFactory.createLineChart(
            &quot;Balancete de entrada e Saída&quot;,
            &quot;Datas&quot;,
            &quot;Quantidade de Dinheiro (R$)&quot;,
            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.