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