Ayuda con paintComponent (g)

Iniciado por portocarrerojava, 6 Diciembre 2015, 03:34 AM

0 Miembros y 1 Visitante están viendo este tema.

portocarrerojava

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. Se 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.

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 PRINCIPAL

Código:
public class PruebaMarcoFigura {
    public static void main (String args []){
       
        MarcoDibujo marco = new MarcoDibujo ();
       
    }
}

                                         CLASE MARCODIBUJO

Código:
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 final JButton deshacerFigura; //Deshace la ultima figura que se haya
                                    //dibujado
    private final 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 final 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 final 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;
    private final JFrame dibujoFiguras;
   
    public MarcoDibujo (){
        super ("Java Drawings");
       
        dibujoFiguras = new JFrame ();
       
        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);
       
        dibujoFiguras.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);   
       
        dibujoFiguras.add (panelHerramientas, BorderLayout.NORTH);
        dibujoFiguras.add (dibujo.obtenerPanelDibujo(), BorderLayout.CENTER);
        dibujoFiguras.add (barraEstado, BorderLayout.SOUTH);
       
        dibujoFiguras.setSize (1000, 400);
        dibujoFiguras.setVisible (true);
    }
}

                                   CLASE PANELDIBUJO

Código:
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 final 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 final JLabel etiquetaEstado;  //representa la barra de estado representa
                                    //coordenadas de la posición actual del
                                    //raton
    private final 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 ();
            System.out.print ("Se presiono el mouse en: ");
            System.out.printf ("(%d, %d)\n", evento.getX (), 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++;
            System.out.print ("Se solto el mouse en: ");
            System.out.printf ("(%d, %d)\n", evento.getX (), evento.getY ());
        }
       
        //maneja evento cuando el usuario mueve el raton
        public void mouseMoved (MouseEvent evento){
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
            System.out.print ("Se movio el mouse a: ");
            System.out.printf ("(%d, %d)\n", 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 ()));
            System.out.print ("Se arrastro el mouse a: ");
            System.out.printf ("(%d, %d)\n", 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);
        }
    }
   
    public void establecerTipoFigura (MiFigura figura){
        if (figura instanceof MiLinea){
            tipoFigura = 0;
        }else if (figura instanceof MiRectangulo){
            tipoFigura = 1;
        }else {
            tipoFigura = 2;
        }
        System.out.println ("Establece el tipo de Figura");
    }
   
    public void establecerColorActual (Color color){
        colorActual = color;
        System.out.println ("Establece el color actual");
    }
   
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
        System.out.println ("Establece si la figura es rellena o no");
    }
   
    public void borrarUltimaFigura (){
        cuentaFiguras--;
        if (cuentaFiguras < 0){
            cuentaFiguras = 0;
            repaint ();
        }else
            repaint ();
        System.out.println ("Borra ultima figura");
    }
   
    public void borrarDibujo (){
        cuentaFiguras = 0;
        repaint ();
        System.out.println ("Borra el dibujo");
    }   
   
    public JPanel obtenerPanelDibujo (){
        return panelDibujo;
    }
}

                                    CLASE MIFIGURA

Código:
import java.awt.Color;
import java.awt.Graphics;

public abstract class MiFigura {       
    private Color miColor;
    private int coordenadaX1,
                coordenadaY1,
                coordenadaX2,
                coordenadaY2;

    public MiFigura (){
        coordenadaX1 = 0;
        coordenadaY1 = 0;
        coordenadaX2 = 0;
        coordenadaY2 = 0;
        miColor = Color.BLACK;
    }

    public MiFigura (int x1, int y1, int x2, int y2, Color color){
        establecerCoordenadaX1 (x1);
        establecerCoordenadaY1 (y1);
        establecerCoordenadaX2 (x2);
        establecerCoordenadaY2 (y2);
        establecerColor (color);
    }

    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 (Color color){
        miColor = color;
    }

    public Color obtenerColor (){
        return miColor;
    }

    public abstract void dibujar (Graphics g);
}

                                 CLASE MILINEA

Código:
import java.awt.Color;
import java.awt.Graphics;

public class MiLinea extends MiFigura {
   
    public MiLinea (){
        super ();
    }
   
    public MiLinea (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Color color){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color);
    }
   
    public void dibujar (Graphics g){
        g.setColor (super.obtenerColor());
        g.drawLine (super.obtenerCoordenadaX1(), super.obtenerCoordenadaY1(),
                super.obtenerCoordenadaX2(), super.obtenerCoordenadaY2());
    }
}

                                  CLASE MIFIGURADELIMITADA

Código:
import java.awt.Color;
import java.awt.Graphics;

public abstract class MiFiguraDelimitada extends MiFigura {
   
    private boolean figuraRellena;
   
    public MiFiguraDelimitada (){
        super ();
        figuraRellena = false;
    }
   
    public MiFiguraDelimitada (int x1, int y1, int x2, int y2, Color color,
            boolean relleno){
        super (x1, y1, x2, y2, color);
        establecerFiguraRellena (relleno);
    }
   
    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 abstract void dibujar (Graphics g);
}

                                      CLASE MIRECTANGULO

Código:
import java.awt.Color;
import java.awt.Graphics;

public class MiRectangulo extends MiFiguraDelimitada {
   
    public MiRectangulo (){
        super ();
    }
   
    public MiRectangulo (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Color color, boolean rellenar){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color,
                rellenar);
    }
   
    public void dibujar (Graphics g){
        g.setColor (super.obtenerColor());
        if (super.obtenerFiguraRellena() == true)
            g.fillRect (super.obtenerCoordenadaX1(), super.obtenerCoordenadaY1(),
                super.obtenerAnchura (), super.obtenerAltura ());
        else
            g.drawRect (super.obtenerCoordenadaX1(), super.obtenerCoordenadaY1(),
                    super.obtenerAnchura (), super.obtenerAltura ());   
    }
}

                                      CLASE MIOVALO

Código:
import java.awt.Color;
import java.awt.Graphics;

public class MiOvalo extends MiFiguraDelimitada {
   
    public MiOvalo (){
        super ();
    }
   
    public MiOvalo (int coordenadax1, int coordenaday1, int coordenadax2,
            int coordenaday2, Color color, boolean rellenar){
        super (coordenadax1, coordenaday1, coordenadax2, coordenaday2, color,
                rellenar);
    } 
   
    public void dibujar (Graphics g){
        g.setColor (super.obtenerColor());
        if (super.obtenerFiguraRellena() == true)
            g.fillOval (super.obtenerCoordenadaX1(), super.obtenerCoordenadaY1(),
                super.obtenerAnchura (), super.obtenerAltura ());   
        else
            g.drawOval (super.obtenerCoordenadaX1(), super.obtenerCoordenadaY1(),
                    super.obtenerAnchura (), super.obtenerAltura ());
    }
}