// _________________________________________________________________________________ // 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; } }