paintComponent() [RESOLVIDO]

9 respostas
L

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

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

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

9 Respostas

L

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
    }
}
Marky.Vasconcelos

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
}
L
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.

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

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

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

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

L

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

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

tkx

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

Coloque-o antes do passo 5!

Assim:

//(...) Codigo anterior
           // "imprimir" passo a passo
            if (JOptionPane.showConfirmDialog(null, "Próximo passo (verificaSeq)", 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!

tkx

Desculpe, esqueci de dizer em qual classe!

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

L

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

Coloque-o antes do passo 5!

Assim:

//(...) Codigo anterior
           // "imprimir" passo a passo
            if (JOptionPane.showConfirmDialog(null, "Próximo passo (verificaSeq)", 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!

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

L

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

muuuuito obrigada!!
tirou um grande peso das minhas costas

Criado 22 de março de 2010
Ultima resposta 23 de mar. de 2010
Respostas 9
Participantes 3