Autor Tema: dibujar línea rectángulo u óvalo Java no se ejecuta paintComponent (Graphics g)  (Leído 9271 veces)

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola a todos, desde hace un tiempo me estoy iniciando en el mundo de Java.

Ahora estoy con un pequeño problema el cual es el siguiente: tengo una interfaz de 5 botones, para borrar la ultima figura, borrar todas las figuras, seleccionar un color, seleccionar el tipo de figura a dibujar (linea, ovalo o rectángulo) y si es relleno o no la figura. Ademas por medio de  eventos del mouse es que determino el punto de inicio y fin del dibujo y lo muestro en una barra de estado.

Sé que los eventos de los botones, de la lista (JComboBox) y el CheckBox funcionan porque puse que imprimiera en pantalla un mensaje cada vez que sucediera el evento, así mismo con el mouse, muestra las coordenadas en la barra de estado ademas de que muestra un mensaje en pantalla indicando  que se presiono o soltó o según el evento. El problema que tengo es que no dibuja nada, al parecer nunca entra al método paintComponent (Graphics g) habiendo hecho llamadas de repaint () donde deberia hacerlas. No se ejecuta el método paintComponent ¿por qué si llamo a repaint?

Alguien que me ayude, adjunto los tres principales archivos, por que los otros son clases de MiLinea, MiRectangulo y MiOvalo. el archivo PanelDibujo.java es el que contiene la interfaz que debe dibujar, MarcoDibujo es el que contiene los botones, checkbox, etc. y Prueba... es el que contiene el main. Gracias de antemano!

Clase MarcoDibujo

Código: [Seleccionar]
import java.awt.Color;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JCheckBox;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.GridLayout;

public class MarcoDibujo extends JFrame {
   
    private JButton deshacerFigura; //Deshace la ultima figura que se haya
                                    //dibujado
    private JButton borrarFiguras;  //Borra todas las figuras del dibujo
    private JComboBox coloresPreferidos;    //13 colores preferidos
    private JComboBox figuraDibujar;        //selecciona figura a dibujar
    private JCheckBox figuraRellena; //selecciona si la figura estara rellena o
                                     //no
    private JLabel barraEstado;
   
    private final String nombreColores [] = {"Negro", "Rojo", "Azul", "Rosado",
        "Amarillo", "Verde", "Naranja", "Celeste", "Morado", "Plomo", "Cyan",
        "Marron", "Blano"};
   
    private final String nombreFigura [] = {"Linea", "Rectangulo", "Ovalo"};
    private JPanel panelHerramientas;
   
    private Color colores [] = {Color.BLACK, Color.RED, Color.BLUE,
        Color.PINK, Color.YELLOW, Color.GREEN, Color.ORANGE, Color.lightGray,
        Color.MAGENTA, Color.GRAY, Color.CYAN, Color.darkGray, Color.WHITE};
   
    private MiFigura figura [] = {new MiLinea (), new MiRectangulo (),
            new MiOvalo ()};
   
    private PanelDibujo dibujo;
   
    public MarcoDibujo (){
        super ("Java Drawings");
       
        barraEstado = new JLabel ("(0, 0)");
        dibujo = new PanelDibujo (barraEstado);
       
        panelHerramientas = new JPanel ();
        panelHerramientas.setLayout (new GridLayout (1, 5));
               
        deshacerFigura = new JButton ("Deshacer Figura");
        deshacerFigura.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    dibujo.borrarUltimaFigura();
                }
            }
        );
       
        borrarFiguras = new JButton ("Borrar Figuras");
        borrarFiguras.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    dibujo.borrarDibujo();
                }
            }
        );
       
        coloresPreferidos = new JComboBox (nombreColores);
        coloresPreferidos.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    if (evento.getStateChange () == ItemEvent.SELECTED){
                        dibujo.establecerColorActual
                            (colores [coloresPreferidos.getSelectedIndex()]);
                    }
                }
            }
        );
       
        figuraDibujar = new JComboBox (nombreFigura);
        figuraDibujar.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    if (evento.getStateChange () == ItemEvent.SELECTED){
                        dibujo.establecerTipoFigura (
                            figura [figuraDibujar.getSelectedIndex ()]);
                    }   
                }
            }
        );
       
        figuraRellena = new JCheckBox ("Relleno / Sin Relleno");
        figuraRellena.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    dibujo.establecerFiguraRellena
                            (figuraRellena.isSelected ());
                }
            }
        );
       
        panelHerramientas.add (deshacerFigura);
        panelHerramientas.add (borrarFiguras);
        panelHerramientas.add (coloresPreferidos);
        panelHerramientas.add (figuraDibujar);
        panelHerramientas.add (figuraRellena);
       
        add (panelHerramientas, BorderLayout.NORTH);
        add (dibujo.obtenerPanelDibujo(), BorderLayout.CENTER);
        add (barraEstado, BorderLayout.SOUTH);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       
        setSize (1000, 400);
        setVisible (true);
    }
}

Clase PanelDibujo

Código: [Seleccionar]
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JLabel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.Graphics;

public class PanelDibujo extends JPanel {

    private MiFigura figuras [];    //almacena todas las figuras que se dibujan
    private int cuentaFiguras;      //cuenta el numero de figuras en el arreglo
    private int tipoFigura;         //Determine el tipo de figura a dibujar
    private MiFigura figuraActual;  //representa figura actual que se esta
                                    //dibujando
    private Color colorActual;      //representa el color del dibujo actual
    private boolean figuraRellena;  //determina si se dibuja una figura rellena
    private JLabel etiquetaEstado;  //representa la barra de estado representa
                                    //coordenadas de la posición actual del
                                    //raton
    private JPanel panelDibujo;
    private int posicionX;
    private int posicionY;
    private int posicionX1;
    private int posicionY1;
    private int posicionX2;
    private int posicionY2;
   
    public PanelDibujo (JLabel etiqueta){
       
        panelDibujo = new JPanel ();
       
        etiquetaEstado = etiqueta;
        figuras = new MiFigura [100];
        cuentaFiguras = 0;
        tipoFigura = 0;
        establecerTipoFigura (new MiLinea ());
        figuraActual = null;
        colorActual = Color.BLACK;
        panelDibujo.setBackground(Color.WHITE);
       
        ManejadorRaton manejador = new ManejadorRaton ();
        panelDibujo.addMouseListener (manejador);
        panelDibujo.addMouseMotionListener (manejador);
    }
   
    private class ManejadorRaton extends MouseAdapter
            implements MouseMotionListener {
        //maneja el evento cuando se oprime el raton
        public void mousePressed (MouseEvent evento){
            switch (tipoFigura){
                case 0:
                    figuraActual = new MiLinea ();
                    break;
                case 1:
                    figuraActual = new MiRectangulo ();
                    break;
                case 2:
                    figuraActual = new MiOvalo ();
                    break;
                default:
                    break;
            }
            posicionX1 = evento.getX ();
            posicionY1 = evento.getY ();
        }
       
        //manejo evento cuando se suelta el boton del raton despues de
        //arrastrarlo
        public void mouseReleased (MouseEvent evento){
            posicionX2 = evento.getX ();
            posicionY2 = evento.getY ();
            if (figuraActual instanceof MiLinea){
                figuras [cuentaFiguras] = new MiLinea (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo){
                figuras [cuentaFiguras] = new MiRectangulo (posicionX1,
                        posicionY1, posicionX2, posicionY2, colorActual,
                        figuraRellena);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual, figuraRellena);
                repaint ();
            }
            figuraActual = null;
            cuentaFiguras++;
        }
       
        //maneja evento cuando el usuario mueve el raton
        public void mouseMoved (MouseEvent evento){
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
       
        //el evento cuando el usuario arrastra el raton con el boton oprimido
        public void mouseDragged (MouseEvent evento){
            posicionX = evento.getX ();
            posicionY = evento.getY ();
            if (figuraActual instanceof MiLinea){
                figuras [cuentaFiguras] = new MiLinea (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo){
                figuras [cuentaFiguras] = new MiRectangulo (posicionX1,
                        posicionY1, posicionX, posicionY, colorActual,
                        figuraRellena);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual, figuraRellena);
                repaint ();
            }
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
    }
   
    public void paintComponent (Graphics g){
        super.paintComponent (g);
       
        System.out.println ("A Pintar");
       
        for (int count = 0; count < cuentaFiguras + 1; count++){
            if (figuras [count] != null)
                figuras [count].dibujar(g);
            else
                ;
        }
    }
   
    public void establecerTipoFigura (MiFigura figura){
        if (figura instanceof MiLinea){
            tipoFigura = 0;
        }else if (figura instanceof MiRectangulo){
            tipoFigura = 1;
        }else {
            tipoFigura = 2;
        }
    }
   
    public void establecerColorActual (Color color){
        colorActual = color;
    }
   
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
    }
   
    public void borrarUltimaFigura (){
        cuentaFiguras--;
        if (cuentaFiguras < 0){
            cuentaFiguras = 0;
            repaint ();
        }else
            repaint ();
    }
   
    public void borrarDibujo (){
        cuentaFiguras = 0;
        repaint ();
    }   
   
    public JPanel obtenerPanelDibujo (){
        return panelDibujo;
    }
}

Clase MarcoFiguraJava

Código: [Seleccionar]
import java.awt.BorderLayout;
import javax.swing.JFrame;

public class PruebaMarcoFigura {
    public static void main (String args []){
       
        MarcoDibujo marco = new MarcoDibujo ();
       
    }
}
« Última modificación: 08 de Diciembre 2015, 18:08 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola portocarrerojava el código que has incluido no compila, faltan clases. Para poder revisarlo añade esas clases, así podremos compilar y tratar de averiguar qué ocurre.

Este es un pequeño ejemplo de dibujado

Código: [Seleccionar]
import javax.swing.*;
import java.awt.*;

public class TestFiguras extends JFrame{
     public TestFiguras(){
          setSize(400,400);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setLocationRelativeTo(null);
          setVisible(true);
     }

     public static void main(String a[]){
         new TestFiguras();
     }

     public void paint(Graphics g){
          g.drawOval(40, 40, 60, 60); //Dibuja un circulo
          g.drawRect(80, 30, 200, 200); // Dibuja un cuadrado
          g.drawRect(200, 100, 100, 200); // Dibuja un rectángulo
     }
}

Salu2

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola, si disculpa, adjunto los otros archivos!!
Gracias

Clase GUIMiFigura2D

Código: [Seleccionar]
import java.awt.Color;
import java.awt.Paint;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.BasicStroke;

public abstract class GUIMiFigura2D {
       
        private Paint miColor;
        private int coordenadaX1,
                    coordenadaY1,
                    coordenadaX2,
                    coordenadaY2;
        private float trazoDibujo;
       
        public GUIMiFigura2D (){
            coordenadaX1 = 0;
            coordenadaY1 = 0;
            coordenadaX2 = 0;
            coordenadaY2 = 0;
            miColor = Color.BLACK;
            trazoDibujo = 0;
        }
       
        public GUIMiFigura2D (int x1, int y1, int x2, int y2, Paint color,
                float trazo){
            establecerCoordenadaX1 (x1);
            establecerCoordenadaY1 (y1);
            establecerCoordenadaX2 (x2);
            establecerCoordenadaY2 (y2);
            establecerColor (color);
            establecerTrazoDibujo (trazo);
        }
       
        public void establecerCoordenadaX1 (int x1){
            coordenadaX1 = (x1 < 0) ? 0 : x1;
        }
       
        public int obtenerCoordenadaX1 (){
            return coordenadaX1;
        }
       
        public void establecerCoordenadaY1 (int y1){
            coordenadaY1 = (y1 < 0) ? 0 : y1;
        }
       
        public int obtenerCoordenadaY1 (){
            return coordenadaY1;
        }
       
        public void establecerCoordenadaX2 (int x2){
            coordenadaX2 = (x2 < 0) ? 0 : x2;
        }
       
        public int obtenerCoordenadaX2 (){
            return coordenadaX2;
        }
       
        public void establecerCoordenadaY2 (int y2){
            coordenadaX1 = (y2 < 0) ? 0 : y2;
        }
       
        public int obtenerCoordenadaY2 (){
            return coordenadaY2;
        }
       
        public void establecerColor (Paint color){
            miColor = color;
        }
       
        public Paint obtenerColor (){
            return miColor;
        }
       
        public void establecerTrazoDibujo (float trazo){
            trazoDibujo = trazo;
        }
       
        public float obtenerTrazoDibujo (){
            return trazoDibujo;
        }
       
        public abstract void dibujar (Graphics2D g2d);
}


Clase MarcoDibujo2D

Código: [Seleccionar]
import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.GridLayout;
import javax.swing.JColorChooser;
import java.awt.Color;
import java.awt.Paint;
import java.awt.Stroke;
import java.awt.BasicStroke;

public class MarcoDibujo2D extends JFrame {
   
    private JButton deshacerFigura; //Deshace la ultima figura que se haya
                                    //dibujado
    private JButton borrarFiguras;  //Borra todas las figuras del dibujo
    private JButton primerColor;
    private JButton segundoColor;
    private JComboBox figuraDibujar;        //selecciona figura a dibujar
    private JCheckBox figuraRellena; //selecciona si la figura estara rellena o
                                     //no
    private JCheckBox guionesCheck;
    private JCheckBox degradadoCheck;
    private JTextField anchoLineaText;
    private JTextField longGuionText;
    private JTextField textoFigura;
    private JTextField textoPanel;
   
    private JLabel barraEstado;
   
    private final String nombreFigura [] = {"Linea2D", "Rectangulo2D",
        "Ovalo2D"};
    private JPanel panelHerramientas;
   
    private GUIMiFigura2D figura [] = {new MiLinea2D (), new MiRectangulo2D (),
            new MiOvalo2D ()};
   
    private Paint colorActual1;
    private Paint colorActual2;
   
    private PanelDibujo2D dibujo;
   
    public MarcoDibujo2D (){
        super ("Java Drawings");
       
        panelHerramientas = new JPanel ();
        panelHerramientas.setLayout (new GridLayout (2, 6));
       
        barraEstado = new JLabel ("(0, 0)");
        dibujo = new PanelDibujo2D (barraEstado);
       
        //borra la ultima figura que se dibujo
        deshacerFigura = new JButton ("Deshacer");
        deshacerFigura.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    dibujo.borrarUltimaFigura();
                }
            }
        );
       
        //borra todas las figuras que se dibujaron
        borrarFiguras = new JButton ("Limpiar");
        borrarFiguras.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    dibujo.borrarDibujo();
                }
            }
        );
       
        //se elije un primer color usar
        primerColor = new JButton ("1er Color");
        primerColor.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    colorActual1 = JColorChooser.showDialog (
                        MarcoDibujo2D.this, "Seleccione un color",
                            (Color) colorActual1);
                    if (colorActual1 == null)
                        colorActual1 = Color.BLACK;
                    dibujo.establecerColorActual1(colorActual1);
                }
            }
        );
       
        //se elije el segundo color a usar
        segundoColor = new JButton ("2do Color");
        segundoColor.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    colorActual2 = JColorChooser.showDialog (
                        MarcoDibujo2D.this, "Seleccione un color",
                           (Color) colorActual2);
                    if (colorActual2 == null)
                        colorActual2 = Color.BLUE;
                    dibujo.establecerColorActual1(colorActual2);
                }
            }
        );
       
        //un texto simple a mostrar: representa la forma de la figura a dibujar
        //no editable
        textoFigura = new JTextField ("Forma:");
        textoFigura.setEditable (false);
       
        //un titulo para mostrar la interfaz de botones, texto y check box
        //no editable
        textoPanel = new JTextField ("INTERFAZ");
        textoPanel.setEditable (false);
       
        //texto editable para ingresar el ancho de la linea de borde, el trazo
        anchoLineaText = new JTextField (5);
        anchoLineaText.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    float anchoLinea = Float.parseFloat(
                        evento.getActionCommand());
                    dibujo.establecerTrazoActual (anchoLinea);
                }
            }
        );
       
        //texto editable para ingresar la longitud del guion.
        longGuionText = new JTextField (5);
        anchoLineaText.addActionListener (
            new ActionListener (){
                public void actionPerformed (ActionEvent evento){
                    float longitudGuion =
                            Float.parseFloat (evento.getActionCommand ());
                    dibujo.establecerLongGuioin (longitudGuion);
                }
            }
        );
       
        //se elije la figura a dibujar
        figuraDibujar = new JComboBox (nombreFigura);
        figuraDibujar.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    if (evento.getStateChange () == ItemEvent.SELECTED){
                        dibujo.establecerTipoFigura (
                            figura [figuraDibujar.getSelectedIndex ()]);
                    }   
                }
            }
        );
       
        //se selecciona si se dibujan guiones o no
        guionesCheck = new JCheckBox ("Guiones");
        guionesCheck.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                     dibujo.establecerUsoGuiones(guionesCheck.isSelected());
                }
            }
        );
       
        //se selecciona si se dibuja con degradado la figura o no
        degradadoCheck = new JCheckBox ("Usar degradado");
        degradadoCheck.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    dibujo.establecerUsoGradiente(degradadoCheck.isSelected());
                }
            }
        );
       
        //se selecciona si se dibuja con relleno la figura o no
        figuraRellena = new JCheckBox ("Relleno / Sin Relleno");
        figuraRellena.addItemListener (
            new ItemListener (){
                public void itemStateChanged (ItemEvent evento){
                    dibujo.establecerFiguraRellena
                            (figuraRellena.isSelected ());
                }
            }
        );
       
        panelHerramientas.add (textoPanel);
        panelHerramientas.add (deshacerFigura);
        panelHerramientas.add (borrarFiguras);
        panelHerramientas.add (textoFigura);
        panelHerramientas.add (figuraDibujar);
        panelHerramientas.add (figuraRellena);
       
        panelHerramientas.add (degradadoCheck);
        panelHerramientas.add (primerColor);
        panelHerramientas.add (segundoColor);
        panelHerramientas.add (anchoLineaText);
        panelHerramientas.add (longGuionText);
        panelHerramientas.add (guionesCheck);       
       
        add (panelHerramientas, BorderLayout.NORTH);
        add (dibujo.obtenerPanelDibujo(), BorderLayout.CENTER);
        add (barraEstado, BorderLayout.SOUTH);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       
        setSize (1000, 400);
        setVisible (true);
    }
}


Clase MiFiguraDelimitada2D.java

Código: [Seleccionar]
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.Paint;

public abstract class MiFiguraDelimitada2D extends GUIMiFigura2D {
   
    private boolean figuraRellena;
    private Paint miColor;
    private boolean usarDegradado;
   
    public MiFiguraDelimitada2D (){
        super ();
        figuraRellena = false;
        miColor = Color.BLACK;
        usarDegradado = false;
    }
   
    public MiFiguraDelimitada2D (int x1, int y1, int x2, int y2, Paint color1,
            Paint color2, boolean relleno, float trazo, boolean degradado){
        super (x1, y1, x2, y2, color1, trazo);
        establecerFiguraRellena (relleno);
        establecerColor2do (color2);
        establecerDegradado (degradado);
    }
   
    public int obtenerAnchura (){
        return Math.abs (super.obtenerCoordenadaX2() -
                super.obtenerCoordenadaX1());
    }
   
    public int obtenerAltura (){
        return Math.abs (super.obtenerCoordenadaY2() -
                super.obtenerCoordenadaY1());
    }
       
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
    }

    public boolean obtenerFiguraRellena (){
        return figuraRellena;
    }
   
    public void establecerColor2do (Paint color){
        miColor = color;
    }
   
    public Paint obtenerColor2do (){
        return miColor;
    }
   
    public void establecerDegradado (boolean degradado){
        usarDegradado = degradado;
    }
   
    public boolean obtenerDegradado (){
        return usarDegradado;
    }
   
    public abstract void dibujar (Graphics2D g2d);
}


Clase MiLinea2D

Código: [Seleccionar]
import java.awt.Paint;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.geom.Line2D;

public class MiLinea2D extends GUIMiFigura2D {
   
    private boolean usoGuiones;
    private float longitudGuion;
   
    public MiLinea2D (){
        super ();
    }
   
    public MiLinea2D (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Paint color, float trazo, boolean guiones,
            float longGuion){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color,
                trazo);
        establecerGuiones (guiones);
        establecerLongGuion (longGuion);
    }
   
    public void establecerGuiones (boolean guion){
        usoGuiones = guion;
    }
   
    public boolean obtenerGuiones (){
        return usoGuiones;
    }
   
    public void establecerLongGuion (float longGuion){
        longitudGuion = longGuion;
    }
   
    public float obtenerLongGuion (){
        return longitudGuion;
    }
   
    public void dibujar (Graphics2D g2d){
        g2d.setPaint (super.obtenerColor());
        float guiones [] = {obtenerLongGuion ()};
       
        if (obtenerGuiones () == false){
            g2d.setStroke (new BasicStroke (super.obtenerTrazoDibujo ()));
            g2d.draw (new Line2D.Double(super.obtenerCoordenadaX1(),
                    super.obtenerCoordenadaY1(), super.obtenerCoordenadaX2(),
                    super.obtenerCoordenadaY2()));
        }else
            g2d.setStroke (new BasicStroke (super.obtenerTrazoDibujo(),
                BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                obtenerLongGuion (), guiones, 0));
    }
}
« Última modificación: 04 de Diciembre 2015, 07:57 por Ogramar »

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
en las dos ultimas respuestas estan las otras clases, no me permitia adjuntar mas de 4 archivos a la vez!!!

Clase MiOvalo2D

Código: [Seleccionar]
import java.awt.Paint;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.geom.Ellipse2D;
import java.awt.GradientPaint;
import java.util.Random;
import java.awt.Color;

public class MiOvalo2D extends MiFiguraDelimitada2D {
   
    Random numAleatorio = new Random ();
   
    public MiOvalo2D (){
        super ();
    }
   
    public MiOvalo2D (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Paint color1, Paint color2, boolean rellenar,
            float trazo, boolean degradado){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color1,
                color2, rellenar, trazo, degradado);
    } 
   
    public void dibujar (Graphics2D g2d){
        if (super.obtenerDegradado () == true)
            g2d.setPaint (new GradientPaint (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), (Color) super.obtenerColor(),
                numAleatorio.nextInt (super.obtenerCoordenadaX2()),
                super.obtenerCoordenadaY2(), (Color) super.obtenerColor2do(),
                    true));
        else
            g2d.setPaint (super.obtenerColor());
       
        g2d.setStroke (new BasicStroke (super.obtenerTrazoDibujo()));
       
        if (super.obtenerFiguraRellena() == true)
            g2d.fill (new Ellipse2D.Double (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), super.obtenerAnchura (),
                    super.obtenerAltura ()));
        else
            g2d.draw (new Ellipse2D.Double (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), super.obtenerAnchura (),
                    super.obtenerAltura ()));
    }
}


Clase MiRectangulo2D

Código: [Seleccionar]
import java.awt.Paint;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.BasicStroke;
import java.awt.geom.Rectangle2D;
import java.awt.GradientPaint;
import java.util.Random;
import java.awt.Color;

public class MiRectangulo2D extends MiFiguraDelimitada2D {
   
    Random numAleatorio = new Random ();
   
    public MiRectangulo2D (){
        super ();
    }
   
    public MiRectangulo2D (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Paint color1, Paint color2, boolean rellenar,
            float trazo, boolean degradado){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color1,
                color2, rellenar, trazo, degradado);
    }
   
    public void dibujar (Graphics2D g2d){
        if (super.obtenerDegradado () == true)
            g2d.setPaint (new GradientPaint (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), (Color) super.obtenerColor(),
                numAleatorio.nextInt (super.obtenerCoordenadaX2()),
                super.obtenerCoordenadaY2(), (Color) super.obtenerColor2do(),
                    true));
        else
            g2d.setPaint (super.obtenerColor());
       
        g2d.setStroke (new BasicStroke (super.obtenerTrazoDibujo()));
       
        if (super.obtenerFiguraRellena() == true)
            g2d.fill (new Rectangle2D.Double (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), super.obtenerAnchura (),
                    super.obtenerAltura ()));
        else
            g2d.draw (new Rectangle2D.Double (super.obtenerCoordenadaX1(),
                super.obtenerCoordenadaY1(), super.obtenerAnchura (),
                    super.obtenerAltura ()));
    }
}


Clase PanelDibujo2D

Código: [Seleccionar]
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Paint;
import javax.swing.JLabel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class PanelDibujo2D extends JPanel {

    private GUIMiFigura2D figuras [];    //almacena todas las figuras que se dibujan
    private int cuentaFiguras;      //cuenta el numero de figuras en el arreglo
    private int tipoFigura;         //Determine el tipo de figura a dibujar
    private GUIMiFigura2D figuraActual;  //representa figura actual que se esta
                                    //dibujando
    private Paint colorActual1;      //representa el color del dibujo actual
    private Paint colorActual2;
    private boolean figuraRellena;  //determina si se dibuja una figura rellena
    private boolean usoGradiente;
    private float trazoActual;   
    private float longGuion;
    private JLabel etiquetaEstado;  //representa la barra de estado representa
                                    //coordenadas de la posición actual del
                                    //raton
    private boolean usoGuiones;
   
    private JPanel panelDibujo;
    private int posicionX;
    private int posicionY;
    private int posicionX1;
    private int posicionY1;
    private int posicionX2;
    private int posicionY2;
   
    public PanelDibujo2D (JLabel etiqueta){
       
        panelDibujo = new JPanel ();
       
        etiquetaEstado = etiqueta;
        figuras = new GUIMiFigura2D [100];
        cuentaFiguras = 0;
        tipoFigura = 0;
        establecerTipoFigura (new MiLinea2D ());
        figuraActual = null;
        colorActual1 = Color.BLACK;
        colorActual1 = Color.BLUE;
        figuraRellena = false;
        usoGradiente = false;
        panelDibujo.setBackground(Color.WHITE);
       
        ManejadorRaton manejador = new ManejadorRaton ();
        panelDibujo.addMouseListener (manejador);
        panelDibujo.addMouseMotionListener (manejador);
    }
   
    private class ManejadorRaton extends MouseAdapter
            implements MouseMotionListener {
        //maneja el evento cuando se oprime el raton
        public void mousePressed (MouseEvent evento){
            switch (tipoFigura){
                case 0:
                    figuraActual = new MiLinea2D ();
                    break;
                case 1:
                    figuraActual = new MiRectangulo2D ();
                    break;
                case 2:
                    figuraActual = new MiOvalo2D ();
                    break;
                default:
                    break;
            }
            posicionX1 = evento.getX ();
            posicionY1 = evento.getY ();
        }
       
        //manejo evento cuando se suelta el boton del raton despues de
        //arrastrarlo
        public void mouseReleased (MouseEvent evento){
            posicionX2 = evento.getX ();
            posicionY2 = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX2, posicionY2, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            figuraActual = null;
            cuentaFiguras++;
        }
       
        //maneja evento cuando el usuario mueve el raton
        public void mouseMoved (MouseEvent evento){
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
       
        //el evento cuando el usuario arrastra el raton con el boton oprimido
        public void mouseDragged (MouseEvent evento){
            posicionX = evento.getX ();
            posicionY = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX, posicionY, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
    }
   
    public void paintComponent (Graphics g){
        super.paintComponent (g);
       
        Graphics2D g2d = (Graphics2D) g;
       
        System.out.println ("A Pintar");
        for (int count = 0; count < cuentaFiguras + 1; count++){
            if (figuras [count] != null)
                figuras [count].dibujar(g2d);
            else
                ;
        }
    }
   
    //establece el tipo de figura a dibujar
    public void establecerTipoFigura (GUIMiFigura2D figura){
        if (figura instanceof MiLinea2D){
            tipoFigura = 0;
        }else if (figura instanceof MiRectangulo2D){
            tipoFigura = 1;
        }else {
            tipoFigura = 2;
        }
    }
   
    //se establece el primer color a usar
    public void establecerColorActual1 (Paint color){
        colorActual1 = color;
    }
   
    //Se establece el segundo color a usar
    public void establecerColorActual2 (Paint color){
        colorActual2 = color;
    }
   
    //Se establece si se dibuja con relleno la figura o no
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
    }
   
    //Establece el trazo actual de la figura
    public void establecerTrazoActual (float trazo){
        trazoActual = trazo;
    }
   
    //se establece la longitud de los guiones
    public void establecerLongGuioin (float longitud){
        longGuion = longitud;
    }
   
    //Establece si se usan guiones para dibujar la línea
    public void establecerUsoGuiones (boolean guiones){
        usoGuiones = guiones;
    }
   
    //se establece si se dibuja con gradiente la figura o no
    public void establecerUsoGradiente (boolean gradiente){
        usoGradiente = gradiente;
    }
   
    //método para borrar la última figura que se dibujo
    public void borrarUltimaFigura (){
        cuentaFiguras--;
        if (cuentaFiguras < 0){
            cuentaFiguras = 0;
            repaint ();
        }else
            repaint ();
    }
   
    //método para borrar todos los dibujos que se dibujaron
    public void borrarDibujo (){
        cuentaFiguras = 0;
        repaint ();
    }   
   
    public JPanel obtenerPanelDibujo (){
        return panelDibujo;
    }
}


Clase PruebaMarcoFigura2D

Código: [Seleccionar]
public class PruebaMarcoFigura2D {
    public static void main (String args []){
       
        MarcoDibujo2D marco = new MarcoDibujo2D ();
       
    }
}
« Última modificación: 04 de Diciembre 2015, 08:01 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, he intentado compilarlo y me salta un error en esta línea de la clase MarcoDibujo

private MiFigura figura [] = {new MiLinea (), new MiRectangulo (), new MiOvalo ()};

El error que marca es "No se encuentra la clase MiFigura"

Salu2

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola, si disculpa, me acabo de dar cuenta que subí otros archivos, pero es un ejercicio parecido con mas botones, mas JComboBox, y mas CheckBox, pero con otras figuras con 2D, sigue usando el mouse, esos 8 archivos debes poder bajarlos y ejecutarlos, sigue habiendo el mismo problema que en el primero que quise pasar, si se halla la solución para uno, se halla para el otro. Gracias.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas cuando intento compilar me sale el error que te he indicado antes

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola, Gracias, pero no puede salir el mismo error, ya que esos 8 archivos últimos que pase que todos tienen terminación 2D (los ocho), no tienen nada que ver con los 4 primeros, solo se parecen en el tipo de ejercicio con cosas aumentadas, la cosa es que se olviden de los 4 primeros o 3 primeros que pase y se analice los últimos 8, pero bueno, gracias de todas maneras, no voy a seguir insistiendo con esto, ya se que fue mi error por no pasar desde el inicio correctamente los archivos.
« Última modificación: 06 de Diciembre 2015, 17:55 por portocarrerojava »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas me había liado con tantas clases, al usar sólo las 8 clases que terminan en 2D sí he podido compilar el código, aunque se presenta el problema que comentabas. Hago un pequeño resumen:

PruebaMarcoFigura2D: crea un objeto MarcoDibujo2D

GUIMiFigura2D: es una clase abstracta de la que heredan MarcoDibujo2D y MiFiguraDelimitada2D

MarcoDibujo2D: clase que extiende a JFrame y donde se encuentran las opciones y botones que el usuario puede elegir. Hay un botón "Limpiar" con un ActionListener que invoca dibujo.borrarDibujo() donde dibujo es un objeto PanelDibujo2D. De la misma forma que este botón tenemos botones "Deshacer", "Primer color", "Segundo color", un Action Listener para un campo JTextField denominado anchoLineaText y otro Action Listener para otro JTextField denominado longGuionText. Hay un ItemListener para el checkbox "Guiones", otro para el checkbox "Degradado" y otro para "Relleno / Sin relleno" y otro para "figuraDibujar".

En la clase PanelDibujo tenemos panelDibujo.addMouseListener (manejador);
        panelDibujo.addMouseMotionListener (manejador);

Y tenemos la clase privada  private class ManejadorRaton extends MouseAdapter implements MouseMotionListener

Los oyentes del evento del ratón parecen funcionar bien, al menos he puesto mensajes para visualizar y muestra los valores capturados.

Aunque no he estudiado en profundidad el código parece que tienes un fallo de conceptos y de bases de Java. La clase PanelDibujo2D hereda de JPanel, ¿para qué declaras un atributo private JPanel panelDibujo;? Al hacer esto y operar sobre el atributo, confundes operaciones sobre la clase con operaciones sobre el propio atributo...

Recomendamos seguir este curso para aclarar todos los conceptos básicos sobre Java: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Al hacer algunos cambios en unas pocas líneas para usar this en lugar de un atributo ya empieza a dibujar (aunque todavía habría muchas cosas que comprobar):

Clase modificada de forma que ya dibuja:

Código: [Seleccionar]
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Paint;
import javax.swing.JLabel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class PanelDibujo2D extends JPanel {

    private GUIMiFigura2D figuras [];    //almacena todas las figuras que se dibujan
    private int cuentaFiguras;      //cuenta el numero de figuras en el arreglo
    private int tipoFigura;         //Determine el tipo de figura a dibujar
    private GUIMiFigura2D figuraActual;  //representa figura actual que se esta
                                    //dibujando
    private Paint colorActual1;      //representa el color del dibujo actual
    private Paint colorActual2;
    private boolean figuraRellena;  //determina si se dibuja una figura rellena
    private boolean usoGradiente;
    private float trazoActual;   
    private float longGuion;
    private JLabel etiquetaEstado;  //representa la barra de estado representa
                                    //coordenadas de la posición actual del
                                    //raton
    private boolean usoGuiones;
   
    //private JPanel panelDibujo;
    private int posicionX;
    private int posicionY;
    private int posicionX1;
    private int posicionY1;
    private int posicionX2;
    private int posicionY2;
   
    public PanelDibujo2D (JLabel etiqueta){
       
        //panelDibujo = new JPanel ();
       
        etiquetaEstado = etiqueta;
        figuras = new GUIMiFigura2D [100];
        cuentaFiguras = 0;
        tipoFigura = 0;
        establecerTipoFigura (new MiLinea2D ());
        figuraActual = null;
        colorActual1 = Color.BLACK;
        colorActual1 = Color.BLUE;
        figuraRellena = false;
        usoGradiente = false;
        this.setBackground(Color.WHITE);
       
        ManejadorRaton manejador = new ManejadorRaton ();
        this.addMouseListener (manejador);
        this.addMouseMotionListener (manejador);
    }
   
    private class ManejadorRaton extends MouseAdapter
            implements MouseMotionListener {
        //maneja el evento cuando se oprime el raton
        public void mousePressed (MouseEvent evento){
            switch (tipoFigura){
                case 0:
                    figuraActual = new MiLinea2D ();
                    break;
                case 1:
                    figuraActual = new MiRectangulo2D ();
                    break;
                case 2:
                    figuraActual = new MiOvalo2D ();
                    break;
                default:
                    break;
            }
            posicionX1 = evento.getX ();
            posicionY1 = evento.getY ();
        }
       
        //manejo evento cuando se suelta el boton del raton despues de
        //arrastrarlo
        public void mouseReleased (MouseEvent evento){
            posicionX2 = evento.getX ();
            posicionY2 = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX2, posicionY2, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            figuraActual = null;
            cuentaFiguras++;
        }
       
        //maneja evento cuando el usuario mueve el raton
        public void mouseMoved (MouseEvent evento){
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
       
        //el evento cuando el usuario arrastra el raton con el boton oprimido
        public void mouseDragged (MouseEvent evento){
            posicionX = evento.getX ();
            posicionY = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX, posicionY, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
    }
   
    public void paintComponent (Graphics g){
        super.paintComponent (g);
       
        Graphics2D g2d = (Graphics2D) g;
       
        System.out.println ("A Pintar");
        for (int count = 0; count < cuentaFiguras + 1; count++){
            if (figuras [count] != null)
                figuras [count].dibujar(g2d);
            else
                ;
        }
    }
   
    //establece el tipo de figura a dibujar
    public void establecerTipoFigura (GUIMiFigura2D figura){
        if (figura instanceof MiLinea2D){
            tipoFigura = 0;
        }else if (figura instanceof MiRectangulo2D){
            tipoFigura = 1;
        }else {
            tipoFigura = 2;
        }
    }
   
    //se establece el primer color a usar
    public void establecerColorActual1 (Paint color){
        colorActual1 = color;
    }
   
    //Se establece el segundo color a usar
    public void establecerColorActual2 (Paint color){
        colorActual2 = color;
    }
   
    //Se establece si se dibuja con relleno la figura o no
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
    }
   
    //Establece el trazo actual de la figura
    public void establecerTrazoActual (float trazo){
        trazoActual = trazo;
    }
   
    //se establece la longitud de los guiones
    public void establecerLongGuioin (float longitud){
        longGuion = longitud;
    }
   
    //Establece si se usan guiones para dibujar la línea
    public void establecerUsoGuiones (boolean guiones){
        usoGuiones = guiones;
    }
   
    //se establece si se dibuja con gradiente la figura o no
    public void establecerUsoGradiente (boolean gradiente){
        usoGradiente = gradiente;
    }
   
    //método para borrar la última figura que se dibujo
    public void borrarUltimaFigura (){
        cuentaFiguras--;
        if (cuentaFiguras < 0){
            cuentaFiguras = 0;
            repaint ();
        }else
            repaint ();
    }
   
    //método para borrar todos los dibujos que se dibujaron
    public void borrarDibujo (){
        cuentaFiguras = 0;
        repaint ();
    }   
   
    public JPanel obtenerPanelDibujo (){
        return this;
    }
}

Al ser el código tan largo resulta difícil de depurar. Para los foros recomendamos centrar mejor el problema sobre fragmentos de código cortos que puedan estudiarse con más facilidad.

Salu2

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Gacias, ahora en la noche reviso lo que me has respondido  :)

portocarrerojava

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Gracias! si ya pude comenzar a dibujar ahora solo tengo que ver detalles no mas para que quede bien, voy a revisar el link que me diste, como dije soy nuevo recien estoy entrando en este mundo hace un par de meses, sobre todo con el operador this, que aun no tengo bien en claro su uso. :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".