duminică, 2 septembrie 2012

Graf Observer


package GRAF;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

public class CanvasGraf extends Canvas {

private static final long serialVersionUID = 1L;
  private int maxx;
  private int maxy;
  private Graf graf=null;

 
  private static final double TWO_PI=2*Math.PI;
  private int diametru;
       private int raza;
  private int x;  
       private int y;
     
       public CanvasGraf()
  {
 setBackground(Color.white);
     maxx = 400;
     maxy = 400;
     repaint();
  }


  public Dimension getPreferredSize()
  {
     return new Dimension(maxx, maxy);
  }

public void paint(Graphics g)
{

        this.diametru=300;
     this.raza=this.diametru/2;
       
     maxx=this.getWidth();
        maxy=this.getHeight();
     
        this.x=maxx/4;
        this.y=maxy/5;
       
       
       g.drawString("Centru",x+raza,y+raza);
      // g.drawOval(x,y,diametru,diametru);    
         
          x+=raza;
          y+=raza;


       for(int i=0;i<10;i++)
       {
       double radians=(TWO_PI/10)*(i+1);
       double sine=Math.sin(radians);
       double cosine=Math.cos(radians);
       int dxmax = x + (int)(raza * sine);
   int dymax = y + (int)(raza * cosine);
   int dim=30;
g.fillOval(dxmax-dim/2,dymax-dim/2, dim, dim);
String info=String.valueOf((char)('A'+i));
g.drawString(info,dxmax-25,dymax);
       }
         if(this.graf!=null)
         {
        System.out.println("aaa");
        for(int i=0;i<10;i++)
           for(int j=i+1;j<10;j++)
             if(graf.Element(i,j)==1)
             {
              double radians=(TWO_PI/10)*(i+1);
                  double sine=Math.sin(radians);
                  double cosine=Math.cos(radians);
                 
                  int dxmax = x + (int)(raza * sine);
            int dymax = y + (int)(raza * cosine);
                double radians1=(TWO_PI/10)*(j+1);
                    double sine1=Math.sin(radians1);
                     double cosine1=Math.cos(radians1);
                    int dxmax1 = x + (int)(raza * sine1);
            int dymax1 = y + (int)(raza * cosine1);
           
            g.drawLine(dxmax,dymax,dxmax1,dymax1);
         }
         }

}

public boolean deseneaza(Graf g) {
// TODO Auto-generated method stub
if(g!=null)
{
System.out.println("null");
}
   this.graf=g;
repaint();
return true;


}

}
package GRAF;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

public class CanvasMatrice extends Canvas {
private static final long serialVersionUID = 1L;
private Graf graf=null;
private int maxx;
private int maxy;
public CanvasMatrice()
{
this.setBackground(Color.white);
maxx=400;
maxy=400;
repaint();
}
public void paint(Graphics g)
{
g.drawLine(20, 50, maxx-50, 50);
g.drawLine(60, 20, 60, maxy-100);
int x_start=80;
int x_end=maxx-90;
int dis_x=(x_end-x_start)/10;
int y_start=45;
for(int i=0;i<10;i++)
{
String s=String.valueOf((char)('A'+i));
g.drawString(s,x_start+i*dis_x, y_start);
}
y_start=70;
x_start=40;
int y_end=maxy-130;
int dis_y=(y_end-y_start)/10;
for(int i=0;i<10;i++)
{
String s=String.valueOf((char)('A'+i));
g.drawString(s,x_start, y_start+i*dis_y);
}
if(graf==null)
{
x_start=80;
y_start=70;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
String s="0";
g.drawString(s,x_start+i*dis_x, y_start+j*dis_y);
}
}
   }
else
{
  x_start=80;
    y_start=70;
   
    for(int i=0;i<10;i++)
  for(int j=0;j<10;j++)
  {
  String sir=String.valueOf( (char)('0'+this.graf.Element(i,j)));
  g.drawString(sir,x_start+j*dis_x,y_start+i*dis_y);
  }
}
}
public Dimension getPreferredSize()
{
return new Dimension(maxx,maxy);
}
public boolean desenaza(Graf graf) {
// TODO Auto-generated method stub
this.graf=graf;
repaint();
return true;
}

}
package GRAF;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DesenareGraf extends JFrame implements Observerr {

private static final long serialVersionUID = 1L;
private JLabel status;
private JPanel panou;
private CanvasGraf c;

public DesenareGraf(Subiect subiect) {
setTitle("Graf");
subiect.InregistrareObserver(this);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(600,600);
this.setLocationRelativeTo(null);
c=new CanvasGraf();
panou=new JPanel();
status=new JLabel("Desen Graf");
panou.add(status);
getContentPane().add(panou,BorderLayout.SOUTH);
getContentPane().add(c,BorderLayout.CENTER);
this.setVisible(true);

}


@Override
public void sendNotify(Graf graf) {
// TODO Auto-generated method stub
if(graf!=null)
this.c.deseneaza(graf);
}



}
package GRAF;

public class Graf
{
    public static final int nrV=20;
    public int mat[][];
    public Varf Varfuri[];
    public int nrVarfuri=0;
    public int i=0;
    public Graf(int nrV)
    {
    mat=new int[nrV][nrV];
    Varfuri=new Varf[nrV];
    i=0;
    nrVarfuri=nrV;
    
    for(int j=0;j<nrV;j++)
    for(int i=0;i<nrV;i++)
    {
    mat[j][i]=0;
    }
   
    }
    public void addVarf(char l)
    {
    Varfuri[i++]=new Varf(l);
    }
    
    public void addMuchie(int x,int y)
    {
    mat[x][y]=1;
    mat[y][x]=1;
    }
    public int Element(int x,int y)
    {
    return mat[x][y];
    }
    public int[][] getMatrice()
    {
    return mat;
    }
}
package GRAF;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MatriceAdiacenta extends JFrame implements Observerr {

private static final long serialVersionUID = 1L;
private JPanel panou;
private JLabel status;
private CanvasMatrice draw;
public MatriceAdiacenta(Subiect sub)
{
sub.InregistrareObserver(this);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setBounds(400, 400, 400, 400);
draw=new CanvasMatrice();
status=new JLabel("Matrice de adiacenta");
panou = new JPanel();
panou.add(status);
this.getContentPane().add(panou,BorderLayout.SOUTH);
this.getContentPane().add(draw,BorderLayout.CENTER);
this.setVisible(true);
}

@Override
public void sendNotify(Graf graf) {
if(graf!=null)
System.out.println("nooooot");
// TODO Auto-generated method stub
draw.desenaza(graf);
}

}
package GRAF;

public interface Observerr {

void sendNotify(Graf graf);

}
package GRAF;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observer;
import java.util.Vector;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Subiect extends JFrame {
public Vector observer;
 private JPanel panel1,panel2,panel3;
  private JLabel label,lstart,lend;
  private JTextField editare,start,end;
  private JButton genereaza;
  private Box box;
  private Graf graf=null;
  private MatriceAdiacenta matr=null;
  private DesenareGraf desen=null;

  public Subiect(int varf)
  {
    graf=new Graf(varf);
    observer=new Vector();
    box=new Box(BoxLayout.Y_AXIS);
panel1=new JPanel(new FlowLayout());
panel2=new JPanel(new FlowLayout());
panel3=new JPanel(new FlowLayout());
label=new JLabel("Numarul de noduri: ");
lstart=new JLabel("start:");
lend=new JLabel("  end:");
editare=new JTextField(5);
editare.setBackground(Color.WHITE);
editare.setHorizontalAlignment(JTextField.LEFT);
   editare.setEditable(false);
editare.setText(Integer.toString(varf));
   
start=new JTextField(10);
start.setBackground(Color.WHITE);
start.setHorizontalAlignment(JTextField.LEFT);
end=new JTextField(10);
end.setBackground(Color.WHITE);
end.setHorizontalAlignment(JTextField.LEFT);
panel1.add(label);
panel1.add(editare);
panel2.add(lstart);
panel2.add(start);
panel3.add(lend);
panel3.add(end);
box.add(panel1);
box.add(Box.createVerticalStrut(30));
box.add(panel2);
box.add(panel3);
Ascultator asc=new Ascultator();
getContentPane().add(box);
genereaza=new JButton("Genereaza");
genereaza.addActionListener(asc);
panel1.add(genereaza,BorderLayout.SOUTH);
getContentPane().add(panel1,BorderLayout.SOUTH);
matr=new MatriceAdiacenta(this);
desen=new DesenareGraf(this);
setBounds(300,300,300,300);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
  
  }

public class Ascultator implements ActionListener
{

public void actionPerformed(ActionEvent e) 
{
    if(e.getActionCommand().equals("Genereaza"))
    {
    String s1=start.getText();
    String s2=end.getText();
    start.setText("");
    end.setText("");
    int x=Integer.parseInt(s1);
    int y=Integer.parseInt(s2);
    if(s1.length()==0 || s2.length()==0 || x<0 || x>9 || y<0|| y>9)
    {
    JOptionPane.showMessageDialog(null, "Date invalide (varfuri 0-9)", "Date", JOptionPane.ERROR_MESSAGE);
    }
    else
    {
    graf.addMuchie(x, y);
    notifyObservers();
    }
    }
}
 
}
@SuppressWarnings("unchecked")
public void InregistrareObserver(Observerr obs) 
{
      observer.addElement(obs);
}

public void notifyObservers() {
for(int i=0;i<observer.size();i++)
{
((Observerr) observer.elementAt(i)).sendNotify(this.graf);
}
}

@SuppressWarnings("unchecked")
public void RemovObserver(Observerr obs) {
observer.addElement(obs);
}
public static void main(String[] args) {
new Subiect(10);
}

}
package GRAF;

public class Varf {
private char eticheta;
private boolean vizitat;
public Varf()
{
}
    public Varf(char a)
    {
    this.eticheta=a;
    vizitat=false;
    }
}

Niciun comentariu:

Trimiteți un comentariu