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

Dibujando con JPanel

Estas en el tema de Dibujando con JPanel en el foro de Java en Foros del Web. Tengo el siguiente codigo, que basicamente lo que hace es crear un JFrame donde se le coloca un JPanel, donde dibuja las coordenadas del mouse ...
  #1 (permalink)  
Antiguo 21/08/2015, 14:37
Avatar de GumiCat  
Fecha de Ingreso: mayo-2014
Ubicación: Argentina
Mensajes: 16
Antigüedad: 10 años, 6 meses
Puntos: 0
Pregunta Dibujando con JPanel

Tengo el siguiente codigo, que basicamente lo que hace es crear un JFrame donde se le coloca un JPanel, donde dibuja las coordenadas del mouse y un circulo.
El codigo:

Código Java:
Ver original
  1. package pruebas;
  2.  
  3. import java.awt.Canvas;
  4. import java.awt.Component;
  5. import java.awt.Graphics;
  6. import java.awt.MouseInfo;
  7. import java.awt.Point;
  8. import java.awt.PointerInfo;
  9.  
  10. import javax.swing.*;
  11.  
  12.  
  13. public class Mouse1 {
  14.  
  15.     public static void main(String[] args)  {
  16.        
  17.         Frame1 frame1 = new Frame1();
  18.        
  19.        
  20.         while(true){
  21.             frame1.canvas1.leer_mouse();
  22.             frame1.canvas1.repaint();
  23.         }
  24.        
  25.     }
  26. }
  27.  
  28.  
  29. @SuppressWarnings("serial")
  30. class Frame1 extends JFrame{
  31.    
  32.     Canvas1 canvas1 = new Canvas1();
  33.    
  34.     public Frame1(){
  35.        
  36.         JFrame a = new JFrame("Ventana");
  37.        
  38.         a.setBounds(100, 100, 250, 200);
  39.         a.setVisible(true);
  40.         a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  41.         a.setResizable(false);
  42.        
  43.         a.add(canvas1);
  44.     }
  45. }
  46.  
  47. @SuppressWarnings("serial")
  48. class Canvas1 extends Canvas{
  49.  
  50.     private int x, y;
  51.    
  52.  
  53.     public void paint(Graphics g){
  54.         //super.paint(g);
  55.        
  56.         g.drawString("Hola mundo", 0, 0);
  57.         g.drawString("X:" + x , 10, 20);
  58.         g.drawString("Y:" + y , 10, 60);
  59.         g.drawOval(x-100, y-100, 12, 12);
  60.        
  61.     }
  62.    
  63.     public void leer_mouse(){
  64.         Point coord_mouse;
  65.         PointerInfo info_mouse;
  66.        
  67.         info_mouse = MouseInfo.getPointerInfo();
  68.         coord_mouse = info_mouse.getLocation();
  69.        
  70.         x = coord_mouse.x;
  71.         y = coord_mouse.y;
  72.        
  73.         System.out.println("x:" + x);
  74.         System.out.println("y:" + y);
  75.        
  76.     }
  77. }

Mi problema está en que el circulo se dibuja en el (0,0) del monitor y no en la ventanita, osea, en el JFrame. Cómo podría hacer para que siga al mouse correctamente?

Acá dejo una imagen descriptiva del problema, no se ve el raton, pero ahí está en el punto (0,0) de la ventana y como ven, el circulo se dibuja defasado


Última edición por GumiCat; 21/08/2015 a las 14:47 Razón: agregar imagen descriptiva del problema
  #2 (permalink)  
Antiguo 23/08/2015, 21:34
 
Fecha de Ingreso: agosto-2015
Mensajes: 16
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Dibujando con JPanel

Que tal mi buen amigo. Quiero comentarte que aparece desfasado debido a que el área donde inicia el JFrame es distinta al área del muse. Es decir las coordenadas del mouse están en función del tamaño de tu monitor. Si quieres que no haya desface deberás hacer el área del JFrame igual al de tu monitor o identificar el punto de partida de tu JFrame y restarle ese valor a la coordenada. A continuación t muestra tu ejemplo modificado.


import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;

import javax.swing.*;


public class Mouse1 {

public static void main(String[] args) {

Frame1 frame1 = new Frame1();


while(true){
frame1.canvas1.leer_mouse();
frame1.canvas1.repaint();
}

}
}

class Frame1 extends JFrame{

Canvas1 canvas1 = new Canvas1();

public Frame1(){

JFrame a = new JFrame("Ventana");

a.setBounds(0, 0, 250, 200);
a.setVisible(true);
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
a.setResizable(false);

a.add(canvas1);
}
}
class Canvas1 extends Canvas{

private int x, y;


public void paint(Graphics g){
//super.paint(g);

g.drawString("Hola mundo", 0, 0);
g.drawString("X:" + x , 10, 20);
g.drawString("Y:" + y , 10, 60);
//g.drawOval(x-100, y-100, 12, 12);
g.drawOval(x, y-26, 12, 12);


}

public void leer_mouse(){
Point coord_mouse;
PointerInfo info_mouse;

info_mouse = MouseInfo.getPointerInfo();
coord_mouse = info_mouse.getLocation();

x = coord_mouse.x;
y = coord_mouse.y;

System.out.println("x:" + x);
System.out.println("y:" + y);

}
}

como puedes observar he restado 26 al eje y en g.drawOval(x, y-26, 12, 12); debido a que este desface corresponde a la pestaña de los botones de cerrar, minimizar y maximizar. También he colocado tu JFrame en 0,0 para que no haya desface en el eje x. Amigo cuidate, sino resuelves tu problema por favor hazlo saber para ver de qué otra forma poder ayudarte. Saludos cordiales.
  #3 (permalink)  
Antiguo 24/08/2015, 12:19
Avatar de Tipdar  
Fecha de Ingreso: octubre-2005
Ubicación: Aquí y allá.
Mensajes: 323
Antigüedad: 19 años, 1 mes
Puntos: 7
Respuesta: Dibujando con JPanel

Estimado GumiCat:
Dentro de cualquier componente Swing el 0,0 está en la esquina superior izquierda, eso incluye las coordenadas del mouse. Te aparece desfazado porque los círculos no se generan teniendo el centro en x,y y el radio r, sino que x,y sería la coordenada superior izquierda y luego vendría el radio a partir de esas coordenadas.
Para que te quedara el centro de la circunferencia en x,y con radio r tendrías que decirle que te genere el círculo en x-r/2,y-r/2 con radio r. Entonces ya no estaría desfazado.
__________________
El último TipdaR

Etiquetas: jframe, jpanel
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 11:41.