Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Volver a repintar el area

Estas en el tema de Volver a repintar el area en el foro de Java en Foros del Web. A través de un formulario debo de dibujar 2 figuras geométricas, el problema es el siguiente si en el Main borro las 2 lineas siguientes ...
  #1 (permalink)  
Antiguo 06/05/2017, 09:24
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Volver a repintar el area

A través de un formulario debo de dibujar 2 figuras geométricas, el problema es el siguiente si en el Main borro las 2 lineas siguientes y las coloco en el formulario.java se dibuja pero en diferentes pantallas cuando tiene que estar las 2 figuras en las misma.

De esta forma no consigo que pinte nada en la ventana.

Main.java
Código Java:
Ver original
  1. pintar pintar = new pintar();
  2.      pintar.setVisible(true);

Y a través del formulario.java llamo al constructor

Código Java:
Ver original
  1. pintar pintar = new pintar(tipo,clor,x,y,height,width);

pintar.java
Código Java:
Ver original
  1. package graficos2d;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5.  
  6. public class pintar extends JFrame {
  7.  
  8.     private String figura, clor;
  9.     private int alto, ancho, x, y;
  10.    
  11.     pintar(){
  12.         setSize(400, 400);
  13.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  14.         setLocationRelativeTo(null);
  15.         setVisible(true);
  16.     }
  17.    
  18.     public pintar(String figura, String clor, int x, int y, int alto, int ancho) {
  19.        
  20.         this.figura = figura;
  21.         this.clor = clor;
  22.         this.x = x;
  23.         this.y = y;
  24.         this.alto = alto;
  25.         this.ancho = ancho;
  26.  
  27.         System.out.println(clor + " " + figura + " " + x + " " + y + " " + alto + " " + ancho);
  28.        
  29.     }
  30.  
  31.     @Override
  32.     public void paint(Graphics g) {
  33.         super.paint(g);
  34.        
  35.         if (figura == "Circulo") {
  36.             g.setColor(Color.BLUE);
  37.             g.fillOval(x, y, ancho, alto);
  38.         } else if (figura == "Rectangulo") {
  39.             g.setColor(Color.RED);
  40.             g.fillRect(x, y, ancho, alto);
  41.         }
  42.        
  43.     }
  44.  
  45. }

Gracias de antemano.
  #2 (permalink)  
Antiguo 06/05/2017, 10:26
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 14 años, 7 meses
Puntos: 61
Respuesta: Volver a repintar el area

No tengo idea la respuesta, pero mirando el codigo que presentas:
- el constructor por default ( el que no tiene parametros) tiene un setVisible(true), mientras que el otro constructor no tiene tal setVisible, alguna razon?
- el constructor por default no estable que tipo de figura es y por tanto no va a dibujar nada.
- cuando usas el constructor por default (las lineas que dices que borras), el constructor hace su setVisible y tu luego lo vuelves a hacer visible haciendo un pintar.setVisible(true), por que?
- por que dices que deberian aparecer 2 figuras? el codigo esta preparado para dibujar 2 formas, pero tal como tienes la clase, el objeto que crees solo sera 1 de ellos, no los 2.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 06/05/2017, 11:23
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Respuesta: Volver a repintar el area

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
No tengo idea la respuesta, pero mirando el codigo que presentas:
- el constructor por default ( el que no tiene parametros) tiene un setVisible(true), mientras que el otro constructor no tiene tal setVisible, alguna razon?
- el constructor por default no estable que tipo de figura es y por tanto no va a dibujar nada.
- cuando usas el constructor por default (las lineas que dices que borras), el constructor hace su setVisible y tu luego lo vuelves a hacer visible haciendo un pintar.setVisible(true), por que?
- por que dices que deberian aparecer 2 figuras? el codigo esta preparado para dibujar 2 formas, pero tal como tienes la clase, el objeto que crees solo sera 1 de ellos, no los 2.

Soy novato en esto de la programacion, y no tengo ni P*ta de idea de como hacerlo si me pudieras echar alguna mano me seria de gran ayuda

cada figura (Circulo, rectangulo) seria en 2 métodos distintos?
  #4 (permalink)  
Antiguo 06/05/2017, 12:33
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 18 años, 4 meses
Puntos: 454
Respuesta: Volver a repintar el area

Hola:

Tal cual lo tienes, pintar es una ventana que pinta una sola figura. El método paint() solo pinta una figura.

Si quieres que la misma ventana pinte varias figuras tendrías que:
- Dentro de pintar, figura, clor, ancho, alto, x e y deberían ser arrays o listas, de foram que el índice 0 de cad uno de ellos sea una figura, el indice 1 otra, etc.
- En vez de pasar los datos en el constructor de pintar, pon un método añadeFigura(......) que añada una nueva figura a una nueva posición del array (en vez de array, igual sería más comodo un ArrayList o LinkedList, que permite añadir).
- El paint() debería tener un bucle para los arrrays, pintando cada figura, más o menos con el código que tienes ahora.

Para que quede mejor, en vez de 6 arrays (figura, clor, x, y, ancho y alto), podías hacer una clase Figura con estos 6 parámetros. Así tu clase pintar tendría un array de Figura y quedaría el código más limpio.

Saludos.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 06/05/2017, 14:37
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Respuesta: Volver a repintar el area

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Tal cual lo tienes, pintar es una ventana que pinta una sola figura. El método paint() solo pinta una figura.

Si quieres que la misma ventana pinte varias figuras tendrías que:
- Dentro de pintar, figura, clor, ancho, alto, x e y deberían ser arrays o listas, de foram que el índice 0 de cad uno de ellos sea una figura, el indice 1 otra, etc.
- En vez de pasar los datos en el constructor de pintar, pon un método añadeFigura(......) que añada una nueva figura a una nueva posición del array (en vez de array, igual sería más comodo un ArrayList o LinkedList, que permite añadir).
- El paint() debería tener un bucle para los arrrays, pintando cada figura, más o menos con el código que tienes ahora.

Para que quede mejor, en vez de 6 arrays (figura, clor, x, y, ancho y alto), podías hacer una clase Figura con estos 6 parámetros. Así tu clase pintar tendría un array de Figura y quedaría el código más limpio.

Saludos.
Gracias por aclararme un poco mas el asunto... pero sigo sin poder mostrar las figuras geométricas. es como si en pintar.java nunca se ejecutara el método paint(Graphicpaints g)

Tengo una nueva clase figura.java

Código Java:
Ver original
  1. package graficos2d;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class figura {
  6.    
  7.     Vector<String> V_tipo = new Vector();
  8.     Vector<String> V_color = new Vector();
  9.     Vector<Integer> V_x = new Vector();
  10.     Vector<Integer> V_y = new Vector();
  11.     Vector<Integer> V_alto = new Vector();
  12.     Vector<Integer> V_ancho = new Vector();
  13.    
  14.    
  15.     public void AddFigura(String tipo,String clor,int x,int y,int height,int width){
  16.        
  17.       V_tipo.add(tipo);
  18.       V_color.add(clor);
  19.       V_x.add(x);
  20.       V_y.add(y);
  21.       V_alto.add(height);
  22.       V_ancho.add(width);
  23.      
  24.       System.out.println(tipo+" "+clor+" "+x+" "+y+" "+height+" "+width);
  25.      
  26.     }
  27.    
  28. }

esto es lo que cambio en pintar.java

Código Java:
Ver original
  1. @Override
  2.     public void paint(Graphics g) {
  3.        
  4.         super.paint(g);
  5.         figura figura = new figura();
  6.        
  7.         for(int c=0; c<figura.V_tipo.size(); c++){
  8.            
  9.             System.out.println("Pintamos");
  10.            
  11.             g.setColor(Color.BLUE);
  12.             g.fillOval(figura.V_x.get(c), figura.V_y.get(c), figura.V_ancho.get(c), figura.V_alto.get(c));
  13.            
  14.         }
  15. }

formulario.java
Código Java:
Ver original
  1. String tipo = String.valueOf(figura.getSelectedItem());
  2.         String clor = String.valueOf(color.getSelectedItem());
  3.        
  4.         int x = Integer.parseInt(X.getText());
  5.         int y = Integer.parseInt(Y.getText());
  6.         int height= Integer.parseInt(alto.getText());
  7.         int width = Integer.parseInt(ancho.getText());
  8.        
  9.         figura figura = new figura();
  10.         figura.AddFigura(tipo, clor, x, y, height, width);

Y esto seria el Main.java

Código Java:
Ver original
  1. public static void main(String[] args) {
  2.        
  3.         formulario form = new formulario();//Interfaz Gráfica
  4.        
  5.         pintar pintar = new pintar();//Interfaz Gráfica donde se ven las figuras geométricas dibujadas
  6.        
  7.     }
  #6 (permalink)  
Antiguo 06/05/2017, 15:06
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 18 años, 4 meses
Puntos: 454
Respuesta: Volver a repintar el area

Hola:

En el método paint() estás haciendo un "new figura()", es decir, estas creando un nuevo objeto figura al que nunca has llamado a sus métodos AddFigure(), así que paint() no pintera ninguna figura simplemente porque el objeto figura que tiene, recién creado, no tiene datos dentro.

En tu formulario haces un "new figure()" (OTRO objeto figura distinto del anerior) al que llamas una vez a AddFigura. No pones el resto del código, pero si cada vez que en el formulario introduces los datos de una figura haces un new figura(), pierdes todo lo anterior. Y ademas no es el mismo objeto figura que el del paint() donde creas otro mas y encima vacio.

Solo tienes que hacer un new de figura en un sitio y pasárselo a todas las demas clases. En el main podrias poner algo asi

Código:
... main ... {
   figure figura = new figure()
   formulario form = new formulario( figure );
   pintar pintar = new pintar( figure )
}
pintar y figure deben guardarse el objeto figure que reciben en el constructor en algún atributo de la clase y usar ese atributo para AddFigure() y para paint(), sin ahcer más new de figura.

Saludos.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 06/05/2017, 15:55
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Respuesta: Volver a repintar el area

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

En el método paint() estás haciendo un "new figura()", es decir, estas creando un nuevo objeto figura al que nunca has llamado a sus métodos AddFigure(), así que paint() no pintera ninguna figura simplemente porque el objeto figura que tiene, recién creado, no tiene datos dentro.

En tu formulario haces un "new figure()" (OTRO objeto figura distinto del anerior) al que llamas una vez a AddFigura. No pones el resto del código, pero si cada vez que en el formulario introduces los datos de una figura haces un new figura(), pierdes todo lo anterior. Y ademas no es el mismo objeto figura que el del paint() donde creas otro mas y encima vacio.

Solo tienes que hacer un new de figura en un sitio y pasárselo a todas las demas clases. En el main podrias poner algo asi

Código:
... main ... {
   figure figura = new figure()
   formulario form = new formulario( figure );
   pintar pintar = new pintar( figure )
}
pintar y figure deben guardarse el objeto figure que reciben en el constructor en algún atributo de la clase y usar ese atributo para AddFigure() y para paint(), sin ahcer más new de figura.

Saludos.
Mis conocimientos no llegan a mas...

En los constructores de las demás clases donde le paso figure como se haría?
  #8 (permalink)  
Antiguo 06/05/2017, 22:54
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 18 años, 4 meses
Puntos: 454
Respuesta: Volver a repintar el area

Hola:

Código:
public class pintar{
   private figura figura;

   public pintar(figure figura) {
       this.figura = figura;
   }

   public void paint(Graphics g) {
       .... this.figura ....
   }

}
y la otra similar.

Un detalle nada mas que no tiene que ver mucho con esto. En java es habitual poner el nombre de clase la primera con mayúsculas. Tus clases deberían ser Pintar, Figura, etc. No es importante, pero la costumbre está tan arraigada que despista bastante cuando no se ve así, con "figura" no sabemos si se refiere a la clase o la variable.

Saludos.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 07/05/2017, 04:10
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Respuesta: Volver a repintar el area

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Código:
public class pintar{
   private figura figura;

   public pintar(figure figura) {
       this.figura = figura;
   }

   public void paint(Graphics g) {
       .... this.figura ....
   }

}
y la otra similar.

Un detalle nada mas que no tiene que ver mucho con esto. En java es habitual poner el nombre de clase la primera con mayúsculas. Tus clases deberían ser Pintar, Figura, etc. No es importante, pero la costumbre está tan arraigada que despista bastante cuando no se ve así, con "figura" no sabemos si se refiere a la clase o la variable.

Saludos.
Muchísimas gracias por la ayuda, ya hace lo que debería de hacer. Y ya para acabar una última cosilla.

De un combo box recogo el nombre del color (String)

Pero como luego con el nombre del color puedo hacer el g.SetColor no sé si me explico.

he pensado en hacer un switch poner los colores que tengo el combo box y directamente establecer el color según cual sea, pero no sé si sería una buena manera
  #10 (permalink)  
Antiguo 07/05/2017, 04:38
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 18 años, 4 meses
Puntos: 454
Respuesta: Volver a repintar el area

Hola:

Lo más sencillo es rellenar un Map con los colores que quieras, algo así (pongo de memoria, tendrás que revisar sintaxis y tal)

Código:
Map <String, Color> colores = new HashMap<>();
colores.put("rojo", Color.red);
colores.put("verde", Color.green);
....
para rellenar el combo, usa colores.keys() y obtendras la lista de strings a meter en el combo. Para recuperar el color a partir del string, basta un colores.get(textoDelCombo).

Color es la clase de java.awt.Color https://docs.oracle.com/javase/7/doc...awt/Color.html

Echale un ojo también a JColorChooser, igual te vale mejor https://docs.oracle.com/javase/tutor...orchooser.html

Saludos.
__________________
Apuntes Java
Wiki de Programación
  #11 (permalink)  
Antiguo 07/05/2017, 07:18
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 10 años, 1 mes
Puntos: 4
Respuesta: Volver a repintar el area

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Lo más sencillo es rellenar un Map con los colores que quieras, algo así (pongo de memoria, tendrás que revisar sintaxis y tal)

Código:
Map <String, Color> colores = new HashMap<>();
colores.put("rojo", Color.red);
colores.put("verde", Color.green);
....
para rellenar el combo, usa colores.keys() y obtendras la lista de strings a meter en el combo. Para recuperar el color a partir del string, basta un colores.get(textoDelCombo).

Color es la clase de java.awt.Color https://docs.oracle.com/javase/7/doc...awt/Color.html

Echale un ojo también a JColorChooser, igual te vale mejor https://docs.oracle.com/javase/tutor...orchooser.html

Saludos.
No se como agradecerte todo lo que me has enseñado, Muchísimas gracias

Etiquetas: area, volver
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.