paintComponent() [RESOLVIDO]

Eu preciso desenhar passo a passo a “construção” do meu grafo.
Num frame tem a matriz de adj desse grafo, a lista de arestas geradas
e o desenho do grafo.
No estado inicial, eu tenho a matriz zerada, a lista vazia e o grafo só com os vertives
O problema é que no estado inicial ja desenha no grafo as arestas do passo seguinte e no passo seguinte as arestas do passo seguinte, e assim por diante.
Eu debuguei meu projeto, pra verificar como estava meu grafo a cada passo e descobri onde começa o erro, mas nao sei como resolver.
A logica é a seguinte: só desenha a linha se houver aresta (se houver 1 na matriz de adj)
vou mostrar no codigo onde ta o erro

[code]package Principal;

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

public class Desenha {

private JFrame frame;
private JTextArea matrizA, list, titulo;

public Desenha(Grafo grafo, String lista) {    //  passo um grafo inicialmente só com os vertices
    frame = new JFrame();
    matrizA = new JTextArea();
    list = new JTextArea();
    titulo = new JTextArea();
    
    matrizA.setText(grafo.Matriz());
    matrizA.setVisible(true);
    matrizA.setBounds(30, 30, 390, 320);
    //--------------------------------------
    titulo.setText(" => Lista de Arestas Geradas:");
    titulo.setVisible(true);
    titulo.setBounds(30, 400, 200, 15);
    //--------------------------------------
    list.setText(lista);
    list.setVisible(true);
    list.setBounds(30, 420, 360, 220);

    frame.add(titulo);
    frame.add(list);
    frame.add(matrizA);

    Grafico painelGrafo = new Grafico(grafo); // passo esse grafo pra classe Grafico q é onde desenha
    frame.getContentPane().add(painelGrafo);
    
    frame.setSize(907, 526);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public JFrame Desenha() {
    return frame;   // so retorna o frame pra eu usar dps abrindo e fechando
}

class Grafico extends JPanel {  // classe interna q desenha

    private Grafo grafo;
    Color Vertice;
    Color Aresta;
    Color Texto;

    public Grafico(Grafo grafo) {  // pega o grafo só com os vertices
        this.grafo = grafo;            // ATE AQUI ESTA CERTO, a matriz esta zerada entao deveria desenhar só os vertices
        this.Vertice = new Color(72, 118, 255);
        this.Aresta = new Color(39, 64, 139);
        this.Texto = new Color(0, 0, 139);
    }

    @Override
    public void paint(Graphics g) {

        super.paint(g);     // painel   // qnd debuguei aqui a matriz ja estava preenchida

// aqui ta o problema, eu nao sei como essa matriz foi preenchida
// pq eu nao alterei o grafo hora nenhuma

        // 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 + 180;
        int yc = this.getHeight() / 2 - 10;

        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) {  // no 1º passo, n deveria entrar nesse if, mas entra e desenha
                    g.setColor(Aresta);
                    g.drawLine(ponto[i].x + 30, ponto[i].y + 20, ponto[j].x + 30, ponto[j].y + 20);
                }
            }
        }

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

}
[/code]

enfim… alguem sabe o q pode ser?
ou viu algum erro nesse codigo?
eu ja li tudo qnt é forum e tutorial, mas nao encontrei nada

essa classe chama a classe desenha

package Principal;

import Grafo.*;
import java.util.*;
import javax.swing.*;

public class VerificaSeq {

    private Grafo grafo;
    private JFrame frame;
    private boolean primeiro;
    String lista = "";

    public VerificaSeq(ArrayList<Vertice> vetor) {
        // cria novo grafo
        int numVertices = vetor.size();  // numero de vertices = tam do vetor
        grafo = new Grafo(numVertices); 

        // logo no inicio ja ordena
        // pq o usuario pode digitar em qq ordem
        // ordena o array pelo grau em ordem n crescente
        Collections.sort(vetor, Collections.reverseOrder());
        grafo.ajusta(vetor);   // mas mantendo o id

         //...

        // acha o maior grau do array
        int maior = vetor.get(0).grau;
        for (int i = 0; i < vetor.size(); i++) {
            if (vetor.get(i).grau > maior) {
                maior = vetor.get(i).grau;
            }
        }

        primeiro = true;  // pra verificar se vai ser o primeiro frame a ser mostrado

        while (maior != 0) {
            
            // verifica se tem valor negativo no vetor
            // verifica se a soma eh par

            // ...
            
            // pra "imprimir" o estado inicial  => ERRO no grafo
            if (primeiro) {
                frame = (new Desenha(grafo, lista)).Desenha();
                frame.setVisible(true);
                primeiro = false;
            }

            // ...

            // só aqui q altera o grafo (a matriz)
            grafo.criaAresta(a1, a2);

            // ...

            // "imprimir" passo a passo
            if (JOptionPane.showConfirmDialog(null, "Próximo passo", null, 2) == JOptionPane.OK_OPTION) {
                frame.dispose();
                frame = (new Desenha(grafo, lista)).Desenha();
                frame.setVisible(true);
            }

            //  ...            

            // tem q verificar toda vez qual eh o maior
            // condição do while
            maior = vetor.get(0).grau;
            for (int i = 0; i < vetor.size(); i++) {
                if (vetor.get(i).grau > maior) {
                    maior = vetor.get(i).grau;
                }
            }
        } // end while
        // se saiu do while quer dizer q só existem valores nulos, entao é seq grafica

        JOptionPane.showMessageDialog(null, "É sequência gráfica.");
        lista = "";  // limpa a lista pra verificar nova seq
    }
}

Não vi o erro que voce se refere no código.

Mas no caso do JPanel sobreescreva paintComponent(Graphics) e não paint(Graphics).

Na 1° linha chame super.paintComponent(g)

E trabalhe apenas com a copia do Graphics como Graphics2D.

public void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();
//Aqui realiza toda a pintura em g2d
g2d.dispose();//Ultima linha
}

[quote=Mark_Ameba]Não vi o erro que voce se refere no código.

Mas no caso do JPanel sobreescreva paintComponent(Graphics) e não paint(Graphics).

Na 1° linha chame super.paintComponent(g)

E trabalhe apenas com a copia do Graphics como Graphics2D.

[code]
public void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();
//Aqui realiza toda a pintura em g2d
g2d.dispose();//Ultima linha
}
[/code][/quote]

eu postei errado… to usando o paintComponent(Graphics g) msm
ao inves de só paint

coloquei Graphics2D g2d = (Graphics2D) g.create();
e mudei tudo pra g2d
e coloquei o g2d.dispose(); no final tb
mas nao alterou nada
continua do msm jeito

coloquei o projeto inteiro pra quem quiser dar uma olhada
por favor, eu ja quebrei a cabeça aqui
preciso entregar dia 30

Olá… baixei seu projeto!

Como rodar para testar? Qual o formato da sequencia que deve ser inserida?

Outra coisa… Tente melhorar seus alertas de erro!
Pude observar que há alertas repetidos! Isso dificulta e muito o tratamento!
Se forem erros iguais, mas tratados em partes diferentes, coloque códigos, tipo “Erro 01: Sequencia de numeros inteiros”

No aguardo para tentar ajudar… de preferencia, o quanto antes, pois tenho um artigo para revisar e se demorar mto talvez não terei tempo antes do dia 30!

Att

[quote=tkx]Olá… baixei seu projeto!

Como rodar para testar? Qual o formato da sequencia que deve ser inserida?

Outra coisa… Tente melhorar seus alertas de erro!
Pude observar que há alertas repetidos! Isso dificulta e muito o tratamento!
Se forem erros iguais, mas tratados em partes diferentes, coloque códigos, tipo “Erro 01: Sequencia de numeros inteiros”

No aguardo para tentar ajudar… de preferencia, o quanto antes, pois tenho um artigo para revisar e se demorar mto talvez não terei tempo antes do dia 30!

Att[/quote]

Entra com uma sequencia de numeros inteiros.
Exemplo: 3 2 1 1 1
(precisa colocar espaço entre eles)

Vou melhor o tratamento de erros agora!
Valeu

Bom… o problema é a ordem q vc colocou o for que desenha o grafo!

Coloque-o antes do passo 5!

Assim:

           //(...) Codigo anterior
           // &quot;imprimir&quot; passo a passo
            if (JOptionPane.showConfirmDialog(null, &quot;Próximo passo (verificaSeq)&quot;, null, 2) == JOptionPane.OK_OPTION) {
                frame.dispose();
                frame = (new Desenha(grafo, lista)).Desenha();
                frame.setVisible(true);
            }

            // passo 5
            int head = vetor.get(0).grau; // head = s1
            for (int i = 1; i &lt; head + 1; i++) {  // de s2 ate s(s1+1)
            //(...) Codigo posterior

[]'s

Qq duvida, n hesite em postar!

Se sua duvida foi solucionada, coloque um [RESOLVIDO] no tópico!

Desculpe, esqueci de dizer em qual classe!

Isto está na classe VerificaSeq, por volta da linha 80!

[quote=tkx]Bom… o problema é a ordem q vc colocou o for que desenha o grafo!

Coloque-o antes do passo 5!

Assim:

           //(...) Codigo anterior
           // &quot;imprimir&quot; passo a passo
            if (JOptionPane.showConfirmDialog(null, &quot;Próximo passo (verificaSeq)&quot;, null, 2) == JOptionPane.OK_OPTION) {
                frame.dispose();
                frame = (new Desenha(grafo, lista)).Desenha();
                frame.setVisible(true);
            }

            // passo 5
            int head = vetor.get(0).grau; // head = s1
            for (int i = 1; i &lt; head + 1; i++) {  // de s2 ate s(s1+1)
            //(...) Codigo posterior

[]'s

Qq duvida, n hesite em postar!

Se sua duvida foi solucionada, coloque um [RESOLVIDO] no tópico![/quote]

Sim… desse jeito o grafo fica certo, mas a matriz e a lista ficam erradas
no primeiro passo, mostra a matriz zerada, a lista tb e o grafo só com os vertices
nos proximos passos, vai mostrando as arestas na matriz, na lista e no grafo

opa… resolvi
erro de logica msm =
projeto grande é dificil achar

muuuuito obrigada!!
tirou um grande peso das minhas costas