setBounds não funciona com JPanel [ RESOLVIDO ]

Tenho um JFrame com dois JPanel
Um tem só botoes e o outro tem um botão e o desenho de um grafo
O problema é q onde era pra desenhar o grafo (o JPanel), aparece só um quadrado branco mostrando só um pedaço do grafo
Eu tentei usar o setBounds pra esse JPanel, mas não fez diferença.
Tentei usar setSize e tb não adiantou

[code]
package Main;

import Arvore.;
import Grafo.
;
import grafo.;
import java.awt.
;
import java.awt.event.;
import javax.swing.
;

public class Principal extends JFrame implements ActionListener {

private JPanel main;
private JPanel panel;
private JPanel panel2;
private JFrame frame;
private JSeparator separador;
private JLabel image;
private JLabel vert;
private JLabel ori;
private JLabel dest;
private JLabel p;
private JMenuItem sobre;
private JMenuItem sair;
private JTextField campo;
private JTextField campo2;
private JComboBox combo1;
private JComboBox combo2;
private JButton ok1;
private JButton aleat;
private JButton graf;
private JButton arv;
private Grafo grafoComp;
int numV;
boolean preenche = false;

public Principal() {
    super("..");
    main = new JPanel();
    main.setLayout(new BorderLayout());
    image = new JLabel(new ImageIcon("rot1.jpg"));
    
    createMenu();

    main.add(image);
    this.add(main);
    this.setSize(800, 535);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

private void createMenu() {
     ...

    // botao grafo completo
    graf = new JButton("Grafo Completo");
    graf.setBounds(400, 263, 130, 20);
    graf.setFont(new java.awt.Font("Comic Sans MS", 4, 13));
    graf.addActionListener(this);

    main.add(graf);
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource() == graf) {
            // cria os botoes do primeiro JPanel

            // botao do segundo JPanel
            arv = new JButton("Árvore");
            arv.addActionListener(this);

            
            frame = new JFrame();
            frame.setLayout(new java.awt.BorderLayout());
            panel = new JPanel();
            panel2 = new JPanel();

            // adiciona os botoes no primeiro JPanel

            // segundo JPanel
            grafoComp.grafoCompleto();
            panel2 = new DesenhaGrafo(grafoComp).Desenha();
            panel2.setBounds(100, 100, 100, 100);
            panel2.add(arv);
            frame.add(panel, java.awt.BorderLayout.PAGE_START);
            frame.add(panel2, java.awt.BorderLayout.CENTER);
            frame.setSize(650, 600);
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            frame.setVisible(true);
    }

    if (e.getSource() == ok1) {
        // ...
        panel2 = new DesenhaGrafo(grafoComp).Desenha();  // atualiza grafo
    }

    if (e.getSource() == aleat) {
        // ...
        panel2 = new DesenhaGrafo(grafoComp).Desenha();  // atualiza grafo
    }

    if (e.getSource() == arv) {
        new GeraArvore(grafoComp);
    }
}

public static void main(String args[]) {
    new Principal();
}

}[/code]

[code]
package Grafo;

import grafo.Grafo;
import java.awt.;
import javax.swing.
;

public class DesenhaGrafo {

private JPanel panel;

public DesenhaGrafo(Grafo grafo) {
    panel = new JPanel(); // cria nova janela pro grafo
    Grafico painelGrafo = new Grafico(grafo); // chama a classe pra desenhar o grafo
    panel.add(painelGrafo);

    panel.setSize(607, 526);
    painelGrafo.setBackground(new java.awt.Color(255, 255, 255));
}

public JPanel Desenha() {
    return panel;
}

class Grafico extends JPanel {
private Grafo grafo;
    Color Vertice;
    Color Aresta;
    Color Texto;

    public Grafico(Grafo grafo) {
        this.grafo = grafo;
        this.Vertice = new Color(100, 149, 237);
        this.Aresta = new Color(25, 25, 112);
        this.Texto = new Color(0, 0, 0);
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);     // painel

        Graphics2D g2d = (Graphics2D) g.create();

        // com coordenadas polares
        int margem = 40;
        int r;

        if (this.getWidth() < this.getHeight()) {
            r = this.getWidth() / 2 - margem;
        } else {
            r = this.getHeight() / 2 - margem;
        }

        int xc = this.getWidth() / 2 - 15;
        int yc = this.getHeight() / 2 - 15;

        double rad = 1.5 * Math.PI;
        double incRad = 2 * Math.PI / grafo.getNumV();

        int x;
        int y;

        Point[] ponto = new Point[grafo.getNumV()];

        for (int cont = 0; cont < grafo.getNumV(); cont++) {

            x = (int) (r * Math.cos(rad) + xc);
            y = (int) (r * Math.sin(rad) + yc);

            ponto[cont] = new Point(x, y);

            rad += incRad;
        }

        for (int i = 1; i < grafo.getNumV(); i++) {
            for (int j = 0; j < i; j++) {
                if (grafo.matrizAdj[i][j] != 0) {
                    g2d.setColor(Aresta);
                    g2d.setFont(new java.awt.Font("Comic Sans MS", 4, 14));
                    g2d.setStroke(new BasicStroke(3f)); //3 pixels de largura
                    g2d.drawLine(ponto[i].x + 30, ponto[i].y + 20, ponto[j].x + 30, ponto[j].y + 20);
                    int peso = grafo.matrizAdj[i][j];
                    g2d.drawString(""+peso,
                            (ponto[i].x + ponto[j].x)/2 + ((int)(Math.random()*20)),
                            (ponto[i].y + ponto[j].y)/2 + ((int)(Math.random()*20)));
                }
            }
        }

        for (int cont = 0; cont < grafo.getNumV(); cont++) {
            g2d.setColor(Vertice);
            g2d.fillOval(ponto[cont].x, ponto[cont].y, 40, 40);
            g2d.setColor(Texto);
            g2d.drawString("v[" + (cont) + "]", ponto[cont].x + 10, ponto[cont].y + 25);
        }
        g2d.dispose();
    }
}

}[/code]

O setBounds não funciona se você estiver usando BorderLayout.
Ou você usa layout null ou o gerenciador de layout vai definir o tamanho para você.

[quote=tiagocampos65]O setBounds não funciona se você estiver usando BorderLayout.
Ou você usa layout null ou o gerenciador de layout vai definir o tamanho para você.[/quote]

msm sem usar layout, não consigo usar o setBounds
mas só com o segundo JPanel q não consigo
com o primeiro q só tem botoes e combobox funciona :S

[code]frame = new JFrame(“Grafo”);
panel = new JPanel();
panel2 = new JPanel();
panel.add(ori);
panel.add(combo1);
panel.add(dest);
panel.add(combo2);
panel.add§;
panel.add(campo2);
panel.add(ok1);
panel.add(aleat);
panel.setBounds(30, 15, 600, 40); // funciona

            panel2 = new DesenhaGrafo(grafoComp).Desenha();  // aqui é o problema
                                                  // aparece só um quadradinho minusculo e não dá pra ver o grafo
            
            panel2.add(arv);  // esse botão aparece normal

            panel2.setBounds(10, 100, 1000, 100);  // não funciona
            frame.add(panel);
            frame.add(panel2);
            frame.setSize(650, 600);
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            frame.setVisible(true);[/code]

Posta a classe Grafo para eu dar uma olhada.

Ta ae uma imagem do problema.

Onde era pra ter o desenho do grafo, aparece só um quadradinho.

Detalhe: usei o BorderLayout pra dar o print


[code]

package grafo;

import java.util.*;

public class Grafo {

public int numV;          // num de vertices
public int numA;          // num de arestas
public int matrizAdj[][]; // matriz de adjacencia
public int peso;

// construtor
public Grafo(int numVert) {

    this.numV = numVert;
    this.numA = 0;            // ainda sem arestas
    matrizAdj = new int[numVert][numVert];

    // inicia com 0 em todas as posiçoes
    for (int i = 0; i < numVert; i++) {
        for (int j = 0; j < numVert; j++) {
            matrizAdj[i][j] = 0;
        }
    }
}

//metodo que gera o grafo completo
public Grafo grafoCompleto() {

    // ...
    return grafoComp;

}

public void criaAresta(Aresta aresta) {
    // ...
}

public void peso(int origem, int destino, int peso) {
    // ...
}

public void pesoAleatorio(int origem, int destino) {

    // ...
}

// pega o num de vert
// usa pra "desenhar"
public int getNumV() {
    return this.numV;
}

public int getNumA() {
    return this.numA;
}

}[/code]

Ainda não consegui entender seu código direito.
Faz o seguinte.

Gera um .jar do seu projeto e manda para mim poder rodá-lo aqui.

[quote=tiagocampos65]Ainda não consegui entender seu código direito.
Faz o seguinte.

Gera um .jar do seu projeto e manda para mim poder rodá-lo aqui.[/quote]

É simples. Tem uma tela inicial que pede o numero de vertices.
Qnd “lê” o numero de vertices, gera o grafo completo.
Que deveria ser mostrado na segunda tela (essa imagem q eu coloquei ae em cima).

Essa segunda tela… deveria mostrar o grafo inicial
e qnd eu seto um peso pra aresta ou ciclo em “pesos aleatorios”, o grafo deveria ser atualizado.

O que acontece corretamente… o problema aqui é só q eu não consigo visualizar o grafo.
Só mostra aquele quadradinho… é ele q eu quero aumentar pra mostrar o grafo e não to conseguindo.

Tenta colocar um layout para o painel do grafico assim.

Vê se da certo depois você me fala.

Esse panel que você coloca o gráfico tem que estár na janela principal e jogar ele como CENTER e os botões e combo box você coloca com NOTH.

   private JPanel panel;  
  
    public DesenhaGrafo(Grafo grafo) {  
        panel = new JPanel(); // cria nova janela pro grafo  
        //Define layout do painel
        panel.setLayout(new BorderLayout());
        Grafico painelGrafo = new Grafico(grafo); // chama a classe pra desenhar o grafo  
        //adiciona o painel no centro.
        panel.add(painelGrafo, BorderLayout.CENTER);  
  
        panel.setSize(607, 526);  
        painelGrafo.setBackground(new java.awt.Color(255, 255, 255));  
    }  
  
    public JPanel Desenha() {  
        return panel;  
    }  
  
    class Grafico extends JPanel {  
    private Grafo grafo;  
        Color Vertice;  
        Color Aresta;  
        Color Texto;  
  
        public Grafico(Grafo grafo) {  
            this.grafo = grafo;  
            this.Vertice = new Color(100, 149, 237);  
            this.Aresta = new Color(25, 25, 112);  
            this.Texto = new Color(0, 0, 0);  
        }  

[quote=tiagocampos65]Tenta colocar um layout para o painel do grafico assim.

Vê se da certo depois você me fala.

Esse panel que você coloca o gráfico tem que estár na janela principal e jogar ele como CENTER e os botões e combo box você coloca com NOTH.

[code]
private JPanel panel;

public DesenhaGrafo(Grafo grafo) {  
    panel = new JPanel(); // cria nova janela pro grafo  
    //Define layout do painel
    panel.setLayout(new BorderLayout());
    Grafico painelGrafo = new Grafico(grafo); // chama a classe pra desenhar o grafo  
    //adiciona o painel no centro.
    panel.add(painelGrafo, BorderLayout.CENTER);  

    panel.setSize(607, 526);  
    painelGrafo.setBackground(new java.awt.Color(255, 255, 255));  
}  

public JPanel Desenha() {  
    return panel;  
}  

class Grafico extends JPanel {  
private Grafo grafo;  
    Color Vertice;  
    Color Aresta;  
    Color Texto;  

    public Grafico(Grafo grafo) {  
        this.grafo = grafo;  
        this.Vertice = new Color(100, 149, 237);  
        this.Aresta = new Color(25, 25, 112);  
        this.Texto = new Color(0, 0, 0);  
    }  

[/code][/quote]

Desse jeito tb não da certo.
O botão árvore ocupa a tela toda e nem aparece o tal quadradinho. =\

Sim… mas você tem que criar Panels diferentes, um para os botões e outro só para o uso do grafo.
Se o botão ocupa o frame inteiro é porque foi setado um borderLayout e o botão foi posto no centro.
Para inserir os botões, aconselho você utilizar o gridBagLayout.

Corrigindo aquele código.


  public Principal() {  
        super("..");  
        main = new JPanel();  
        
        image = new JLabel(new ImageIcon("rot1.jpg"));  
          
        createMenu();  
        this.setLayout( new BorderLayout());
        main.add(image);  
        this.add(main, BorderLayout.CENTER);  

Alguém tem uma idéia melhor?
Pq a minha pelo visto não vai dar certo.

Eu preciso de uma tela do jeito q está na figura…
Ae qnd eu clicar em “pesos aleatórios” o grafo atualiza
Eu devo usar o repaint(); ??

A msm coisa deve acontecer qnd eu quiser setar o peso de uma determinada aresta.

O código está no primeiro post…
Tentei fazer adicionando 2 JPanel em um JFrame e não deu certo.
Alguem pode ajudar?


Consegui \o/

Mto obg, tiagocampos65!