Problema com ArrayList

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

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

Mostra teu codigo,

ps: Nao esquece a tag code.

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

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

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

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.

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

[code]
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 vertices;
private ArrayList 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) {...}

}[/code]

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

valeu bgomes. deu certo era isso mesmo. brigadaum