23 de mayo de 2010

Dibujar lineas en Java

   Dibujar en java no es fácil, pero tampoco es cosa difícil, cosa del otro mundo. Lo mas fácil es dibujar líneas, para ello lo que hacemos es cargar al método gráfico el color, el tipo de línea, el tamaño y cualquier otra cosa que se nos ocurra para darle estilo a nuestro dibujo.

// Dibujo de líneas, rectángulos y óvalos.
import java.awt.*;
import javax.swing.*;

public class LineasRectsOvalos extends JFrame {

// establecer la cadena de la barra de título y dimensiones de la ventana
public LineasRectsOvalos()
{
super( "Dibujo de líneas, rectángulos y óvalos" );

setSize( 400, 165 );
setVisible( true );
}

// mostrar varias líneas, rectángulos y óvalos
public void paint( Graphics g )
{
super.paint( g );  // llamar al método paint de la superclase

g.setColor( Color.RED );
g.drawLine( 5, 30, 350, 30 );

g.setColor( Color.BLUE );
g.drawRect( 5, 40, 90, 55 );
g.fillRect( 100, 40, 90, 55 );

g.setColor( Color.CYAN );
g.fillRoundRect( 195, 40, 90, 55, 50, 50 );
g.drawRoundRect( 290, 40, 90, 55, 20, 20 );

g.setColor( Color.YELLOW );
g.draw3DRect( 5, 100, 90, 55, true );
g.fill3DRect( 100, 100, 90, 55, false );

g.setColor( Color.MAGENTA );
g.drawOval( 195, 100, 90, 55 );
g.fillOval( 290, 100, 90, 55 );

} // fin del método paint

// ejecutar la aplicación
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
LineasRectsOvalos aplicacion = new LineasRectsOvalos();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}

} // fin de la clase LineasRectsOvalos

   Este ejemplo fue visto en: CasiDiablo.net

15 comentarios:

  1. la cagaste con el
    //JFrame.setDefaultLookAndFeelDecorated(true);

    xD!!

    ResponderEliminar
  2. Mmmmm.... No entiendo ese comentario puesto que solo es el look and feel....

    ResponderEliminar
  3. Merci d'avoir un blog interessant

    ResponderEliminar
  4. muy buen ejemplo, gracias!

    ResponderEliminar
  5. gracias me sirvio mucho tu codigo.

    saludos

    ResponderEliminar
  6. exelnte aporte de gran ayuda

    ResponderEliminar
  7. Me agrado mucho tu aporte la verdad esta muy bien pero yo tengo una duda espero y me puedas aclarar algo, yo tengo un programa que permite dibujar o simplemente escribir con el mouse mediante eventos, pero le quiero añadir un boton para que borre lo que se dibuje y poder volver a dibujar...la verdad parece facil pero me estoy dando de topes con eso, dejo el codigo acontinuacion por si no me supe explicar muy bien



    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Shape;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.geom.Line2D;
    import java.util.ArrayList;
    import javax.swing.JComponent;
    import javax.swing.JFrame;

    public class Dibujar extends JComponent {

    private Point inicioArrastre;
    private Point finArrastre;
    private ArrayList lineas = new ArrayList();

    public Dibujar() {
    super();
    addMouseListener(new MouseAdapter() {

    public void mousePressed(MouseEvent e) { // cuando se presiona el mouse
    inicioArrastre = new Point(e.getX(), e.getY());
    repaint();
    }

    public void mouseReleased(MouseEvent e) { // cuando se deja de presionar el mouse
    finArrastre = new Point(e.getX(), e.getY());
    Shape linea = crearLinea(inicioArrastre.x, inicioArrastre.y, finArrastre.x, finArrastre.y);
    lineas.add(linea);
    repaint();
    }
    });
    addMouseMotionListener(new MouseMotionAdapter() {

    public void mouseDragged(MouseEvent e) { // cuando se esta arrastrando el mouse
    finArrastre = new Point(e.getX(), e.getY());
    Shape linea = crearLinea(inicioArrastre.x, inicioArrastre.y, finArrastre.x, finArrastre.y);
    lineas.add(linea);
    inicioArrastre = new Point(finArrastre.x, finArrastre.y);
    repaint();
    }
    });
    }

    public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.RED);
    for (Shape linea : lineas) { // dibuja todos las elipses
    g2.draw(linea);
    }
    }

    private Line2D.Float crearLinea(int x1, int y1, int x2, int y2) {
    return new Line2D.Float(x1, y1, x2, y2);
    }

    public static void main(String[] a3d) {
    JFrame ventana = new JFrame("Dibujar");
    ventana.setSize(400, 300);
    ventana.setLocationRelativeTo(null);
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.add(new Dibujar());
    ventana.setVisible(true);
    }
    }


    de antemano gracias

    ResponderEliminar
  8. Hola, disculpa la tardanza, bueno, lo primero que veo es que tienes 2 Mouse Listener, podrías unir el Drag, Pressed y Released en uno solo. Lo otro y mas simple que se me ocurre es que trabajes bajo un Panel en ves de un Frame, entonces te creas un método para limpiar el panel cada vez que lo requieres, algo como esto:

    void limpiar(JPanel contenido){
    contenido.removeAll();
    contenido.repaint();
    }

    Donde "contenido" es el JPanel que envías por parámetro, ya luego te queda cargar de nuevo el componente, te recomiendo utilizar una clase que inicialice todo para no recargar una y otra vez este método, algo así:

    /*EN EL PRINCIPAL (MAIN)*/
    JFrame ventana = new JFrame ("Dibujar");
    JPanel contenido = new JPanel();
    ventana.setSize(400, 300);
    ventana.setLocationRelativeTo(null);
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.add(contenido);
    CargaComponentes();

    void CargaComponentes(){
    contenido.add(new Dibujar());
    contenido.setVisible(true);
    }

    Así al limpiar el panel haces esto y listo:

    public void limpiar(JPanel panel){
    panel.removeAll();
    panel.repaint();
    CargaComponentes();
    }

    Recuerda setear el tamaño del panel o maximizarlo al mismo tamaño del frame para que se vea que es uno solo.... Saludos!!

    ResponderEliminar
  9. ¡Hola!
    Estoy programando desde Eclipse Indigo, utilizo Swing.
    ¿Cómo puedo hacer para que aparezca una linea cuando se seleccione una checkbox?
    Tengo varios checkbox con sus correspondientes lineas, puedo dibujar las lineas por separado :
    public void paint( Graphics g )
    {
    super.paint( g );
    g.setColor( Color.BLACK);
    g.drawLine( 75, 475, 75, 360 );
    g.drawLine( 75,475,100,360);
    }
    pero no puedo incluirlo en el evento de click en el checkbox.

    Si aplico repaint() en dicho evento, es solo una actualización, ¿podría de alguna forma ocultarla segun la creo y después mostrarla?

    ResponderEliminar
    Respuestas
    1. Buena pregunta, ya está publicado en la nueva entrada, cualquier duda comenta.

      Enlace: http://carlitoxenlaweb.blogspot.com/2012/07/dibujar-lineas-con-jcheckbox.html

      Eliminar
  10. ¡¡Muchas gracias de antemano!!

    ResponderEliminar
  11. ola me podrias ayudar xf como de hacen mas gruesas las lineas???

    ResponderEliminar
    Respuestas
    1. Esto es AWT con Graphics básico, deberías utilizar para eso Graphics2D, acá la doc, si necesitas algo en específico házmelo saber para publicar algo sobre ello.... Saludos!!!

      http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html

      Eliminar
  12. hola, como se hacen mas gruesas laas lineas (codigo) xf

    ResponderEliminar
    Respuestas
    1. Ya respondí esta pregunta, pero aquí va de nuevo, debes re-dibujar el método paint (enlace que comente anteriormente):

      public void paint (Graphics g) {
      if (g instanceof Graphics2D) {
      Graphics2D g2 = (Graphics2D)g;
      g2.setStroke(new BasicStroke(5.0f)); // grosor
      g2.drawLine (10, 10, 100, 100);
      }
      }

      Eliminar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.