// _________________________________________________________________________________
// Se crea una ventana con menUs y nos permite dibujar mAximo 3 lIneas y 3 circulos
// ---------------------------------------------------------------------------------
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Proyecto_1 extends JFrame
{
JMenu MenuArchivo, MenuGrafico, MenuEdicion;
JMenuItem ArchivoGuardar, ArchivoSalir, GraficoLinea, GraficoCirculo, EdicionLimpiar;
Grafico G = new Grafico();
final int NADA = 0, LINEA = 1, CIRCULO = 2;
int X[] = new int[2], Y[] = new int[2];
boolean OK = false; // (OK) Para diferenciar el primer punto del segundo
int Primitiva = NADA;
public static void main(String R[]) { new Proyecto_1(); }
public Proyecto_1()
{
this.getContentPane().setLayout(null); // Contenedor nulo
this.setTitle("Editor Grafico 1.0"); // Titulo de la ventana
this.setResizable(true); // Si es redimensionable
this.setLocation(100, 100); // Posicion
this.setSize(new Dimension(600, 450)); // Dimensiones
this.setBackground(Color.green);
this.add(G); G.setBounds(0, 0, 600, 450);
JMenuBar BarraMenu = new JMenuBar(); // Barra de menU
BarraMenu.setBackground(Color.green);
BarraMenu.setForeground(Color.yellow);
MenuArchivo = InsertaMenu("Archivo");
MenuArchivo.setMnemonic(KeyEvent.VK_A); // Se accesa con Alt-A
InsertaItem(MenuArchivo, ArchivoGuardar, "guardaR", KeyEvent.VK_R); //Alt-R
InsertaItem(MenuArchivo, ArchivoSalir, "Salir", KeyEvent.VK_S); //Alt-S
MenuGrafico = InsertaMenu("Grafico");
MenuGrafico.setMnemonic(KeyEvent.VK_G); // Se accesa con Alt-G
InsertaItem(MenuGrafico, GraficoLinea, "Linea", KeyEvent.VK_L); // Alt-L
InsertaItem(MenuGrafico, GraficoCirculo, "Circulo", KeyEvent.VK_C); // Alt-C
MenuEdicion = InsertaMenu("Edicion");
MenuEdicion.setMnemonic(KeyEvent.VK_E); // Se accesa con Alt-E
InsertaItem(MenuEdicion, EdicionLimpiar, "Limpiar", KeyEvent.VK_I); // Alt-L
BarraMenu.add(MenuArchivo);
BarraMenu.add(MenuGrafico);
BarraMenu.add(MenuEdicion);
setJMenuBar(BarraMenu);
G.addMouseListener(new EventoRaton());
this.setVisible(true);
}
JMenu InsertaMenu(String CAD) { return new JMenu(CAD); }
void InsertaItem(JMenu MENU, JMenuItem ITEM, String CAD, int KEY_EVENT)
{
ITEM = new JMenuItem(CAD);
ITEM.setMnemonic(KEY_EVENT);
ITEM.setBackground(Color.green);
ITEM.setForeground(Color.black);
MENU.add(ITEM);
ITEM.addActionListener(new Evento_Opciones());
}
protected void processWindowEvent(WindowEvent e)
{ if (e.getID() == WindowEvent.WINDOW_CLOSING) System.exit(0); }
class Evento_Opciones implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Salir")) System.exit(0);
if (e.getActionCommand().equals("Guardar")) { }
if (e.getActionCommand().equals("Linea")) { Primitiva = LINEA; }
if (e.getActionCommand().equals("Circulo")) { Primitiva = CIRCULO; }
if (e.getActionCommand().equals("Limpiar")) { G.Inicializa_Vectores( ); }
}
}
class EventoRaton implements MouseListener
{
// Estos mEtodos no nos interesan por ahora. Sin embargo hay que ponerlos
// al tratarse de una interfaz
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// Se crea el mEtodo que si nos interesa trabajar
public void mouseClicked(MouseEvent e)
{
String boton = "";
if ( !OK ) { X[0] = e.getX(); Y[0] = e.getY(); OK = true; }
else { X[1] = e.getX(); Y[1] = e.getY(); OK = false; }
switch (e.getButton())
{
// boton = "izquierdo";
case MouseEvent.BUTTON1: if ( !OK) G.Dibuja(X, Y, Primitiva); break;
case MouseEvent.BUTTON2: break; // boton = "central";
case MouseEvent.BUTTON3: break; // boton = "derecho";
}
}
}
}
class Grafico extends Canvas
{
final int NADA = 0, LINEA = 1, CIRCULO = 2, Limite = 3;
int X[] = new int[2], Y[] = new int[2], Primitiva = 1, N_Lineas = 0, N_Circulos = 0;
Linea V_Linea[] = new Linea[3];
Circulo V_Circulo[] = new Circulo[3];
boolean Limpiar = false;
public Grafico()
{
setBackground(Color.red); // Color del fondo
setForeground(Color.yellow); // Color de los trazos
Inicializa_Vectores( );
}
void Dibuja(int X[], int Y[], int Primitiva)
{
switch ( Primitiva )
{
case LINEA:
if ( N_Lineas < Limite )
{
V_Linea[N_Lineas] = new Linea( X[0], Y[0], X[1], Y[1] );
N_Lineas++;
}
break;
case CIRCULO:
if ( N_Circulos < Limite )
{
V_Circulo[N_Circulos] = new Circulo( X[0], Y[0], X[1], Y[1] );
N_Circulos++;
}
break;
}
repaint();
}
public void paint(Graphics A)
{
int NL = 0, NC = 0;
if ( !Limpiar )
{
for ( NL = 0; NL < N_Lineas; NL++)
A.drawLine( V_Linea[NL].X1, V_Linea[NL].Y1, V_Linea[NL].X2, V_Linea[NL].Y2 );
for ( NC = 0; NC < N_Circulos; NC++)
A.drawOval( V_Circulo[NC].X, V_Circulo[NC].Y, V_Circulo[NC].Diametro, V_Circulo[NC].Diametro );
}
else Limpiar = false;
}
void Inicializa_Vectores( )
{
N_Lineas = 0; N_Circulos = 0;
Limpiar = true;
repaint();
}
}
class Linea
{
int X1=0, Y1=0, X2=0, Y2=0;
public Linea() { } // Se quedan los datos en ceros
public Linea(int X1, int Y1, int X2, int Y2)
{
this.X1 = X1; this.Y1 = Y1;
this.X2 = X2; this.Y2 = Y2;
}
}
class Circulo
{
int X = 0, Y = 0, Radio = 0, Diametro = 0;
public Circulo() {} // Se quedan los datos en ceros
public Circulo(int X1, int Y1, int X2, int Y2)
{
Radio = (int) Math.hypot ( (double)(X2 - X1), (double)(Y2 - Y1) );
X = X1 - Radio;
Y = Y1 - Radio;
Diametro = 2 * Radio;
}
}