Problema com ArrayList

9 respostas
Ruan_Alesi

Fala pessoal, é o seguinte: Estou implementando um programinha p desenhar um grafo na tela. Tenho as seguintes classes: Vertice, Aresta, e a classe principal Grafo, que tem duas variaveis: um ArrayList e ArrayList. O problema e q quando seto uma propriedade(Point) de um elemento da lista Vertice, a mesma propriedade e alterada em todos os elementos da lista. Como? se estou setando o unico elemento q deve ser alterado com get(i)? Alguem pode me ajudar? agradeço desde ja

9 Respostas

rmendes08

Provavelmente você está adicionando o mesmo elemento várias vezes na lista.

henriqueluz

Mostra teu codigo,

ps: Nao esquece a tag code.

Ruan_Alesi

tah ih o codigo. Na segunda vez q passa pelo FOR, a linha ‘grafo.getVertices().get(i).setP(point);’ altera o point de todos os itens da lista vertice em Grafo

public class Vertice{
    private Point p;
    private int v;
    
    public Vertice(){
        
    }
    
    public Vertice(Graphics g,int x, int y, int n){
        this.p = new Point(x, y);
        this.v = n;
    }
}
...
public static Grafo grafo = new Grafo();
public ArrayList<Aresta> arestaList = new ArrayList<Aresta>();
public ArrayList<Vertice> vertice = new ArrayList<Vertice>();
...
arestaList.add(aresta)
grafo.setArestas(arestaList);
vertice.add(vertice)
grafo.setVertices(vertice);
...
for(Vertice umVertice : grafo.getVertices()){
            int i = umVertice.getNVertice()-1;
            
            if(i%2 != 0){
                point.setLocation(point.x, point.y+200);
            }else{
                point.setLocation(point.x+200, 200);
            }
            grafo.getVertices().get(i).setP(point);
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setColor(Color.black);
            g2.fillOval(point.x, point.y, 50, 50);
            g2.setColor(Color.white);
            g2.fillOval(point.x+5, point.y+5, 40, 40);
            g2.setColor(Color.black);
            g2.drawString(i+1+"", point.x+20, point.y+30);
            g2.dispose();
        }
isaiaspf

Ruan,grafo.setVertices(vertice);Coloca como você monta esta lista vertice.

Ruan_Alesi
int qtdVertice = Integer.parseInt(jTextField1.getText()); //quantidade de vertice do grafo            
            for(int i = 1; i <= qtdVertice; i++){
                vertice.add(new Vertice(i));
            }
            grafo.setVertices(vertice);
isaiaspf

Cara, tá bem complicado de encontrar o problema só com esses trechos de código. Coloque todo código e eu posso tentar te ajudar.

Ruan_Alesi
foi mal, quis polpar codigo p fica mais facil de entender (não adiantou muito neh). Tah ai intaum:
public class Vertice {

    private Point p;
    private int v;
    
    public Vertice(){
        
    }
    public Vertice(int v){
        this.v = v;
    }
    //gettters e setters
}

public class Aresta {
    private Vertice origem;
    private Vertice destino;
    private int valor;

    public Aresta(Vertice origem, Vertice destino, int valor) {
        this.origem = origem;
        this.destino = destino;
        this.valor = valor;
    }
    //gettters e setters
}

public class Grafo {
    private ArrayList<Vertice> vertices;
    private ArrayList<Aresta> arestas;

    public Grafo(){
        
    }
    
    public Grafo(ArrayList<Vertice> vertices, ArrayList<Aresta> arestas) {
        this.vertices = vertices;
        this.arestas = arestas;
    }
    //gettters e setters
}

//interface grafica para inserir dados do grafo
public class Principal extends JFrame{

    public static grafo.Grafo grafo = new grafo.Grafo();
    ArrayList<Aresta> arestaList = new ArrayList<Aresta>();
    ArrayList<Vertice> vertice = new ArrayList<Vertice>();

    private void geraGrafoActionPerformed(java.awt.event.ActionEvent evt) {                                          
        grafo.setArestas(arestaList);
        Grafo g = new Grafo();
        g.setVisible(true);
    }                                         

    private void gerarVerticesActionPerformed(java.awt.event.ActionEvent evt) {                                              
        if(jTextField1 != null || !jTextField1.getText().equals("")){
            int qtdVertice = Integer.parseInt(jTextField1.getText()); //quantidade de vertice do grafo
            ArrayList<String> lista = new ArrayList<String>();//lista para preenchimento de uma JTable
            
            for(int i = 1; i <= qtdVertice; i++){
                lista.add("Vertice " + i);
                vertice.add(new Vertice(i));
            }
            grafo.setVertices(vertice);
            
	    DefaultListModel dlm = new DefaultListModel();
            for(String umNome : lista){
                dlm.addElement(umNome);
            }
            listaOrigem.setModel(dlm);
            listaDestino.setModel(dlm);
        }
    }                                             

    private void btAddArestaActionPerformed(java.awt.event.ActionEvent evt) {                                             
        try{
            int origem = listaOrigem.getSelectedIndex();
            int destino = listaDestino.getSelectedIndex();
            int fluxo = Integer.parseInt(txtFluxo.getText());
            arestaList.add(new Aresta(vertice.get(origem), vertice.get(destino), fluxo));

	    //gerando JTable com lista de arestas
            tabelaArestas.getColumnModel().getColumn(0).setPreferredWidth(20);
            tabelaArestas.getColumnModel().getColumn(1).setPreferredWidth(20);
            tabelaArestas.getColumnModel().getColumn(2).setPreferredWidth(20);
            DefaultTableModel dtm = (DefaultTableModel) tabelaArestas.getModel();
            dtm.setNumRows(0);
            for(Aresta umaAresta : arestaList){
                dtm.addRow(new Object[]{umaAresta.getOrigem().getNVertice(), umaAresta.getDestino().getNVertice(), 
                    umaAresta.getValor()});
                
            }
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, "Ocorreu um erro: "+e, "ERRO!", ERROR);
        }
    }

    private void geraGrafoActionPerformed(java.awt.event.ActionEvent evt) {                                          
        grafo.setArestas(arestaList);
        TelaGrafo g = new TelaGrafo();
        g.setVisible(true);
    }
}

public class TelaGrafo extends javax.swing.JFrame {
    public TelaGrafo() {
        initComponents();
        this.setVisible(true);
        Painel painel = new Painel();
        JScrollPane jsp = new JScrollPane(painel);
        jsp.setPreferredSize(new Dimension(painel.getX(), painel.getY()));
        this.add(jsp, BorderLayout.CENTER);
        this.setContentPane(jsp);       
    }
    private void initComponents() {...}
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TelaGrafo().setVisible(true);
            }
        });
    }   
}

public class Painel extends javax.swing.JPanel {

    private grafo.Grafo grafo = Principal.getGrafo();
    private Point point = new Point(0, 30);
    
    public Painel() {
        initComponents();
        setBackground(Color.white);
    }
    
    
    
 @Override
    public void paint(Graphics g) {
        
        for(Vertice umVertice : grafo.getVertices()){
            int i = umVertice.getNVertice()-1;
            
            if(i%2 != 0){
                point.setLocation(point.x, point.y+200);
            }else{
                point.setLocation(point.x+200, 200);
            }
            grafo.getVertices().get(i).setP(point);
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setColor(Color.black);
            g2.fillOval(point.x, point.y, 50, 50);
            g2.setColor(Color.white);
            g2.fillOval(point.x+5, point.y+5, 40, 40);
            g2.setColor(Color.black);
            g2.drawString(i+1+"", point.x+20, point.y+30);
            g2.dispose();
        }
        for(Aresta umaAresta : grafo.getArestas()){   
            int origem = umaAresta.getOrigem().getNVertice()-1;
            Vertice vOrigem = grafo.getVertices().get(origem);
            Point pOrigem = origem2.getPointVertice();
            int destino = umaAresta.getDestino().getNVertice()-1;
            Vertice vDestino = grafo.getVertices().get(destino);
            Point pDestino = destino2.getPointVertice();
            desenhaArestas(g, pOrigem, pDestino, umaAresta.getValor());
        }   

    
    private void desenhaArestas(Graphics g, Point origem, Point destino, int fluxo) {...}
}
B

Olá Ruan,

O seu problema esta na classe “Painel”, pois voce esta criando o objeto Point (linha 130: private Point point = new Point(0, 30);) e usando este mesmo objeto durante a iteração do “for”

Tente criar uma nova instancia “new” a cada iteração, mais ou menos assim:

# @Override  
#     public void paint(Graphics g) {  
#           
#         for(Vertice umVertice : grafo.getVertices()){  
#             int i = umVertice.getNVertice()-1;  
#             Point point = new Point(0, 30);  
#             if(i%2 != 0){  
#                 point.setLocation(point.x, point.y+200);  
#             }else{  
#                 point.setLocation(point.x+200, 200);  
#             }  
#             grafo.getVertices().get(i).setP(point);  
#             Graphics2D g2 = (Graphics2D) g.create();  
#             g2.setColor(Color.black);  
#             g2.fillOval(point.x, point.y, 50, 50);  
#             g2.setColor(Color.white);  
#             g2.fillOval(point.x+5, point.y+5, 40, 40);  
#             g2.setColor(Color.black);  
#             g2.drawString(i+1+"", point.x+20, point.y+30);  
#             g2.dispose();  
#         }  

//....... resto do condigo

e veja se funciona

Abraços

Ruan_Alesi

valeu bgomes. deu certo era isso mesmo. brigadaum

Criado 26 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 9
Participantes 5