GUI Gráficos Para empezar a dibujar en Java, es necesario entender su sistema de coordenadas, el cual es un esquema para identificar cada uno de los posibles puntos en la pantalla (figura 1). De manera predeterminada, la esquina superior izquierda de un componente de la GUI (un applet o una ventana) tiene las coordenadas (0,0). Un par de coordenadas estará compuesto por una coordenada x (la coordenada horizontal) y una coordenada y (la coordenada vertical). La coordenada x es la distancia horizontal que se desplaza hacia la derecha, desde la esquina superior izquierda. La coordenada y es la distancia vertical que se desplaza hacia abajo, desde la esquina superior izquierda. eje x (0,0) (x, y) eje y Figura 1 El texto y las figuras se muestran en pantalla mediante la especificación de coordenadas. Las unidades de coordenadas se miden en píxeles. Un píxel es la unidad de resolución más pequeña de la pantalla de un monitor de computadora. La coordenada superior izquierda (0,0) de una ventana se encuentra detrás de la barra de titulo de la ventana. Por esta razón, las coordenadas de dibujo deben ajustarse para dibujar dentro de los bordes de la ventana. La clase Container (superclase de todas las ventanas en Java) tiene el método getInsets, el cual devuelve un objeto Insets (paquete java.awt) para este fin. Un objeto Insets tiene cuatro miembros public: top, bottom, left y right, los cuales representan el número de píxeles desde cada extremo de la ventana hasta el área de dibujo para la ventana. Contextos Gráficos y objetos de Gráficos Un contexto de gráficos en Java permite dibujar en la pantalla. Un objeto Graphics administra un contexto de gráficos y dibuja píxeles en la pantalla que representan texto y otros objetos gráficos (como líneas, elipses, rectángulos y polígonos). Los objetos Graphics contienen métodos para dibujar, manipular tipos de letra, manipular colores y demás. La clase Graphics es una clase abstract (no se pueden instanciar objetos de ella). La clase Component es la superclase para muchas de las clases del paquete java.awt. El método paint de Component toma un objeto Graphics como argumento. El sistema pasa este objeto al método paint cuando se requiere una operación de pintar (paint) para un Component. El encabezado del método paint es: Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005. public void paint(Graphics g) El método paint raras veces es llamado directamente por el programador, ya que el dibujo de gráficos es un proceso controlado por eventos. Cuando se ejecuta una ventana, se llama automáticamente al método paint. Para que paint sea llamado de nuevo, deberá ocurrir un evento (como minimizar y maximizar la ventana). De manera similar cuando se muestra cualquier objeto Component, se hace una llamada al paint de ese objeto. Si el programador necesita llamar a paint, se hace una llamada al método repaint de Component. Este método solicita una llamada al método update de la clase Component lo más pronto posible, para borrar el fondo el objeto Component, quitando cualquier dibujo anterior, y después update llama directamente a paint. El método repaint es llamado con frecuencia por el programador, para forzar una operación paint. El método repaint no debe redefinirse, ya que realiza ciertas tareas dependientes del sistema. Los encabezados para repaint y update son: public void repaint() public void update(Graphics g) El método update toma un objeto Graphics como argumento, el cual es suministrado automáticamente por el sistema cuando se hace la llamada a update. Las subclases de Component generalmente pintan desde sus métodos paint. Referencia: Deitel H, Deitel P. 2004. Java TM Cómo programar. Quinta Edición. Pearson. Prentice Hall. Ejemplo que demuestra la redefinición de paint /* * Gui02Paint.java * * Created on 8 de junio de 2005, 06:25 PM */ package GUI; import java.awt.*; import javax.swing.*; /** * * @author mdeabreu */ public class Gui02Paint extends javax.swing.JFrame { /** Constructor de Gui02Paint */ public Gui02Paint() { initComponents(); setSize(400,400); //lienzo de dibujo lienzo1 = new Lienzo(); lienzo1.setBackground(Color.lightGray); lienzo1.addMouseListener(new java.awt.event.MouseAdapter() { Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005. public void mouseClicked(java.awt.event.MouseEvent evt) { lienzo1MouseClicked(evt); } }); getContentPane().add(lienzo1, java.awt.BorderLayout.CENTER); } private void initComponents() { label1 = new java.awt.Label(); button1 = new java.awt.Button(); panel1 = new java.awt.Panel(); getContentPane().setLayout(new java.awt.BorderLayout(5, 5)); setTitle("Figuras"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); button1.setLabel("Dibujar Rectangulo"); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { button1ActionPerformed(evt); } }); label1.setText("Seleccione Figura"); panel1.add(label1); panel1.add(button1); getContentPane().add(panel1, java.awt.BorderLayout.SOUTH); pack(); } private void button1ActionPerformed (java.awt.event.ActionEvent evt) { lienzo1.repaint(); // llama a paint definido en la clase Lienzo } /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } private int int int int int int void dibujarRectangulo(Graphics g){ h = lienzo1.getSize().height; w = lienzo1.getSize().width; x =(int)(Math.random()*1000)%(w/4); y =(int)(Math.random()*1000)%(h/4); width = w - 2*x; height = h - 2*y; Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005. boolean raised = ((int)(Math.random()*10)>5)?true:false; g.fill3DRect(x,y,width,height,raised); } public static void main(String args[]) { new Gui02Paint().show(); } // Variables declaration private java.awt.Label label1; private Lienzo lienzo1; private java.awt.Button button1; private java.awt.Panel panel1; // Clase interna que tiene acceso a los miembros de Gui02Paint // y redefine el método paint private class Lienzo extends Canvas{ public void paint(Graphics g){ // establece un Color al azar para la figura int r = (int)(Math.random()*1000)%256; int v = (int)(Math.random()*1000)%256; int a = (int)(Math.random()*1000)%256; g.setColor(new Color(r,v,a)); dibujarRectangulo(g); } } } Obtener el contexto gráfico de un Componente usando el método getGrapics() /* * Gui02.java * * Created on 8 de junio de 2005, 04:41 PM */ package compAvanz12005.unidad2.GUI; import java.awt.*; /** * * @author mdeabreu */ public class Gui02 extends javax.swing.JFrame { /** Creates new form Gui02 */ public Gui02() { initComponents(); setSize(400,400); } private void panel2 = label1 = panel4 = initComponents() { new java.awt.Panel(); new java.awt.Label(); new java.awt.Panel(); Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005. label2 = new java.awt.Label(); textField1 = new java.awt.TextField(); button1 = new java.awt.Button(); canvas1 = new java.awt.Canvas(); setTitle("Arcos"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); label1.setAlignment(java.awt.Label.CENTER); label1.setBackground(new java.awt.Color(0, 204, 204)); label1.setFont(new java.awt.Font("Dialog", 0, 14)); label1.setText("Dibujo de Arcos"); panel2.add(label1); getContentPane().add(panel2, java.awt.BorderLayout.NORTH); panel4.setLayout(new java.awt.GridLayout(1, 3)); label2.setAlignment(java.awt.Label.CENTER); label2.setText("Angulo en Grados"); panel4.add(label2); textField1.setColumns(4); panel4.add(textField1); button1.setBackground(new java.awt.Color(0, 204, 204)); button1.setLabel("Dibujar Arco"); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { button1ActionPerformed(evt); } }); panel4.add(button1); getContentPane().add(panel4, java.awt.BorderLayout.SOUTH); getContentPane().add(canvas1, java.awt.BorderLayout.CENTER); pack(); } private void button1ActionPerformed(java.awt.event.ActionEvent evt) { Graphics g = canvas1.getGraphics(); angulo = Integer.parseInt(textField1.getText().trim()); dibujar(g); g.dispose(); //liberar recursos } private void dibujar(Graphics g){ int h = canvas1.getSize().height; int w = canvas1.getSize().width; // Dibuja los ejes g.setColor(Color.BLACK); g.drawLine(w/2,0,w/2,h); // eje y Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005. g.drawLine(0,h/2,w,h/2); //eje x int r = (int)(Math.random()*1000)%256; int v = (int)(Math.random()*1000)%256; int a = (int)(Math.random()*1000)%256; g.setColor(new Color(r,v,a)); g.fillArc(10,10,w-20,h-20,0,angulo); } /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } /** * @param args the command line arguments */ public static void main(String args[]) { new Gui02().show(); } // Variables declaration private java.awt.Button button1; private java.awt.Canvas canvas1; private java.awt.Label label1; private java.awt.Label label2; private java.awt.Panel panel2; private java.awt.Panel panel4; private java.awt.TextField textField1; private int angulo; } Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2005.