Dibujar automata

Alejandro
11 de Abril del 2006
Saludos compañeros, estoy realizando una aplicacion en Java que simula el comportamieno de un automata (grafo), y como resultado final para presentarlo pensaba en ademas de presentar los datos en forma d matriz, poder realizarlo tambien en forma mas visual como un automata, con los arcos, transiciones, etc... Sabeis si existe algun programa que haga algo parecido ??? Gracias por adelantado.

jose cuentas
11 de Abril del 2006
no te envio la forma exacta para crearlo pero este proyecto te puede servir.

debes compilar las clases

este es el primcipal

//Elaborado por:
// DAVID ANTONIO FRANCO BORRE. Matrícula 472144.
// FERNANDO ENRIQUE LOPEZ MARTINEZ. Matrícula 964097.
// LISBETH ISABEL URUETA VIVANCO. Matrícula 472150.

package shape;

import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;

class Ventana extends JFrame{

JToolBar jtb;
JComboBox jcb;
Lienzo li;
JButton color;
JButton boton;
JFrame jf;
Color c;
JCheckBox jckb;

// Se define el constructor de la clase Ventana inicializando
// los componentes swing que se utilizaran y se adicionan a esta.
Ventana(){

jf = this;
c = new Color(0);
color = new JButton("Color");
jtb = new JToolBar();
boton=new JButton("Undo");
jcb = new JComboBox();
jckb = new JCheckBox("Relleno",false);

jcb.addItem("");
jcb.addItem("Linea");
jcb.addItem("Rectangulo");
jcb.addItem("Ovalo");
jtb.add(jcb);
jtb.add(color);
jtb.add(boton);
jtb.add(jckb);

// Este es el Listener que permite controlar la seleccion
// del JChekBox para rellenar las figuras
jckb.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent ie){
if(jckb.isSelected())
li.setFillColor(1);
else
li.setFillColor(0);
}});


//Este es el Listener que permite gestionar la seleccion
//del color de la figura
color.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
c = JColorChooser.showDialog(jf,"Color",new Color(0,0,0));
li.setBackgroundColor(c);
}});

boton.setEnabled(false);
boton.setMnemonic(KeyEvent.VK_U);
boton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
li.remove();
}

});

Container c=getContentPane();
c.add("South",jtb);
c.add("Center",li = new Lienzo(this));

jcb.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent ie){
li.dibujo(jcb.getSelectedIndex());
}});



addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
dispose();
System.exit(0);
}});
}
}


class Lienzo extends Canvas{

Point pi,p1,p2;
int x,r,index;
boolean flag=false;
Vector shape;
MyShape ms;
Color actual;
Ventana ven;

Lienzo(Ventana v){

ven=v;
index = 0;
actual = new Color(0);
shape = new Vector();
r = 0;
pi=new Point(0,0);
p1=new Point(0,0);
p2=new Point(0,0);
x = 0;
setBackground(Color.white);
setSize(400,400);

//mediante este evento capturamos el punto inicial pi
//en el que se da click por primera vez al dibujar la figura
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
if(x != 0){
p1=me.getPoint();
if(!flag){
pi=me.getPoint();
flag = true;
}
}
}});

//mediante este evento capturamos el punto en el
//cual soltamos el click del mouse
addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent me){
p2=me.getPoint();
flag = false;
switch(x){ // se adicciona al vector la figura seleccionada
//en el JComboBox
case 1 : shape.add(index,new MyLine(p1,p2,getForeground())); ++index; break;
case 2 : shape.add(index,new MyRect(p1,p2,getForeground(),r)); ++index; break;
case 3 : shape.add(index,new MyOval(p1,p2,getForeground(),r)); ++index; break;

}
//controlamos la deshabilitacion del boton si el
//vector queda vacio
if(!shape.isEmpty())
ven.boton.setEnabled(true);


repaint();


}});

//en este evento se captura un punto cada vez que se
//mueve el mouse y muestra como va quedando la figura

addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent me){
p2=me.getPoint();
repaint();
}});
}


// en este metodo estamos sobreescribiendo el método paint
//para dibujar las figuras
public void paint(Graphics g){


//se ajustan las coordenadas de dibujo de las figuras
//(ovalo y rectangulo)
int ancho, alto;

ancho = Math.abs(pi.x - p2.x);
alto = Math.abs(pi.y - p2.y);

if(x > 1) {
if(pi.x >= p2.x) {
p1.x = pi.x - ancho;
p2.x = pi.x;
}

if(pi.y >= p2.y) {
p1.y = pi.y - alto;
p2.y = pi.y;
}

}

// se invoca el método draw de cada figura, dependiendo
// de su posicion dentro del arreglo
for (int i = 0 ; i < index ; ++i){
ms = (MyShape)shape.get(i);
g.setColor(ms.color);
ms.draw(g);
}

setForeground(actual);

//Se selecciona la figura a dibujar.
//Se especifica si la figura se rellena o no en caso
//del rectángulo o el ovalo.
switch(x) {
case 1 : // Dibuja una línea con las coordenadas
// especifícadas.
g.drawLine(p1.x,p1.y,p2.x,p2.y);
break;


case 2 : if(r==0)
//Dibuja un rectángulo sencillo
g.drawRect(p1.x,p1.y,ancho,alto);
else
//Dibuja un rectángulo con relleno
g.fillRect(p1.x,p1.y,ancho,alto);
break;

case 3 : if(r==0)
//Dibuja un ovalo sencillo
g.drawOval(p1.x,p1.y,ancho,alto);
else
//Dibuja un ovalo con relleno
g.fillOval(p1.x,p1.y,ancho,alto);
break;

default: break;
}
}

public void dibujo(int xy){
x = xy;
}

public void setBackgroundColor(Color y){
setForeground(y);
actual = y;
}

public void remove(){
if (!shape.isEmpty()){
--index;
shape.removeElementAt(index);
pi.x = pi.y = p1.x = p1.y = p2.x = p2.y = 0;
repaint();
if (shape.isEmpty())
ven.boton.setEnabled(false);
}
}

public void setFillColor(int x){
r = x;
}
}

public class Shape{

public static void main(String []ar){
Ventana v = new Ventana();
v.setSize(600,500);
v.setVisible(true);
v.setTitle("PROGRAMA DE DIBUJO");
}
}
//--------------------------------------------------

//Elaborado por:
// DAVID ANTONIO FRANCO BORRE. Matrícula 472144.
// FERNANDO ENRIQUE LOPEZ MARTINEZ. Matrícula 964097.
// LISBETH ISABEL URUETA VIVANCO. Matrícula 472150.

package shape;

import java.awt.*;
import shape.MyShape;

public class MyLine extends MyShape {

MyLine(){
p1.x = p1.y = p2.x = p2.y = 0;
color = Color.black;
}

MyLine(Point x, Point y, Color c){
p1 = x;
p2 = y;
color = c;
}

public void draw(Graphics g){
g.setColor(color);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
//----------------------------------------------------------------
package shape;

import java.awt.*;
import shape.MyShape;

public class MyOval extends MyShape {

int fill;

MyOval(){
fill= 0;
p1.x = p1.y = p2.x = p2.y = 0;
color = Color.black;
}

MyOval(Point x, Point y, Color c, int fill){
p1 = x;
p2 = y;
color = c;
this.fill = fill;
}

public void draw(Graphics g){
g.setColor(color);
if (fill != 0)
g.fillOval(p1.x, p1.y, p2.x-p1.x, p2.y-p1.y);
else
g.drawOval(p1.x, p1.y, p2.x-p1.x, p2.y-p1.y);
}
}
//------------------------------------------------------------------------
package shape;

import java.awt.*;
import shape.MyShape;

public class MyRect extends MyShape {

int fill;

MyRect(){
fill = 0;
p1.x = p1.y = p2.x = p2.y = 0;
color = Color.black;
}

MyRect(Point x, Point y, Color c, int fill){
p1 = x;
p2 = y;
color = c;
this.fill = fill;
}

public void draw(Graphics g){
g.setColor(color);
if (fill != 0)
g.fillRect(p1.x, p1.y, p2.x-p1.x, p2.y-p1.y);
else
g.drawRect(p1.x, p1.y, p2.x-p1.x, p2.y-p1.y);
}
}
//------------------------------------------------
package shape;

import java.awt.*;


abstract class MyShape{

Point p1,p2;
Color color;

MyShape(){
p1=new Point(0,0);
p2=new Point(0,0);
color=new Color(0);
}

MyShape(Point x,Point y, Color c){
p1 = x;
p2 = y;
color = c;
}

public void draw(Graphics g){
}
}