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

18 respostas
D

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]

18 Respostas

E

Pode colocar em um JFrame, JDialog, JTabbedPane, em outro JPanel. Depende do que quer fazer com o painel.

D

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?

E

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?

D

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?

E

O painel é adicionado em tempo de execução? Tente chamar revalidate após adicioná-lo.

panel.add(painelComGrafico); panel.revalidate();

D

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.

E

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.

E
Vai um exemplo com três JPanels, um dentro do outro. Para facilitar a visualização, cada um está com um cor diferente.
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);
			}
		});
	}
	
}
D

no JPanel principal:

private void geraGraficos() {
        panGraficoDeGastos.add(FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos));
    }
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)
        );
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();

Classe de construcao do grafico:

/*
 * 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<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);
    }
}
E

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(); }

D

Testei e o JPanel esta sendo gerado corretamente.
usei o revalidate e continua sem funcionar.

Mais alguma sugestão?

E

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.

D

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? :?

E

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();

D

usei o revalidate e ainda não foi adicionado o painel!

D
tambem tentei adicionar outro tipo de componente como um JLabel e não tive resposta:
JLabel lblGraficoDeGastos = new JLabel();
        FabricaDeGraficos.criaGraficoDeGastos(this.totalSelecionados, this.totalDebitos, this.totalCreditos);
        lblGraficoDeGastos.setIcon(new ImageIcon("graficosPNG/grafico.png"));

        panGraficoDeGastos.add(lblGraficoDeGastos);
        panGraficoDeGastos.revalidate();
E

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.

D

Muito Obrigado pela ajuda Eric!

Agora funciona perfeitamente.

Criado 11 de dezembro de 2010
Ultima resposta 14 de dez. de 2010
Respostas 18
Participantes 2