2
« en: 01 de Diciembre 2015, 17:21 »
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
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
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
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class PruebaMarcoFigura {
public static void main (String args []){
MarcoDibujo marco = new MarcoDibujo ();
}
}