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

18 respostas
DavidUser

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

Eric_Yuzo

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

DavidUser

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?

Eric_Yuzo

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?

DavidUser

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?

Eric_Yuzo

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

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

DavidUser

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.

Eric_Yuzo

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.

Eric_Yuzo
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);
			}
		});
	}
	
}
DavidUser

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

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

DavidUser

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

Mais alguma sugestão?

Eric_Yuzo

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.

DavidUser

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

Eric_Yuzo

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

DavidUser

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

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

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.

DavidUser

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