Evento de ratón en un JPanel (Java)
Resuelto
csi_bern
Mensajes publicados
72
Estado
Miembro
-
danimo -
danimo -
Hola,
Tengo dos clases por ahora y aquí un resumen:
y
(la méthode main a été retirée)
Ma question est la suivante : pourquoi quand je clique dans ma fenêtre, qui contient donc mon JPanel, le message demandé via println ne s’affiche pas dans la console ? J’ai mis ce println comme test car toutes les actions que je voulais récupérer par le clic de souris ne fonctionnent pas !
Please help
Merci d’avance
Configuration: Windows XP / Internet Explorer 8.0
Tengo dos clases por ahora y aquí un resumen:
import java.awt.BorderLayout; import javax.swing.JFrame; public class Fenetre extends JFrame { private panImage panGauche = new panImage(); public Fenetre(){ this.setSize(300, 300); this.getContentPane().add(panGauche, BorderLayout.CENTER); this.setVisible(true); } } y
import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JPanel; public class panImage extends JPanel { public void PanImage() { this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { System.out.println("cliqué " + e.getX()); } }); } public void paintComponent(Graphics g) { g.setColor(Color.black); g.fillRect(50, 50, 50, 50); } } (la méthode main a été retirée)
Ma question est la suivante : pourquoi quand je clique dans ma fenêtre, qui contient donc mon JPanel, le message demandé via println ne s’affiche pas dans la console ? J’ai mis ce println comme test car toutes les actions que je voulais récupérer par le clic de souris ne fonctionnent pas !
Please help
Merci d’avance
Configuration: Windows XP / Internet Explorer 8.0
4 respuestas
Hola,
Necesito más información sobre tus 2 clases...
Antes que nada, sería mejor que los nombres de las clases empezaran con una mayúscula.
- ¿es public class Fenetre extends JFrame { la clase 1?
- y public class PanImage extends JPanel { la clase 2?
- ¿Cómo haces para llamar a la clase 2 desde la clase 1?
- Dijiste "¿No habría manera de insertar el listener directamente en la clase 2?" ¿Es eso lo que haces, verdad?
- Sería bueno que nos des más código (especialmente respecto a la clase 2)
Gracias...
Dan
Necesito más información sobre tus 2 clases...
Antes que nada, sería mejor que los nombres de las clases empezaran con una mayúscula.
- ¿es public class Fenetre extends JFrame { la clase 1?
- y public class PanImage extends JPanel { la clase 2?
- ¿Cómo haces para llamar a la clase 2 desde la clase 1?
- Dijiste "¿No habría manera de insertar el listener directamente en la clase 2?" ¿Es eso lo que haces, verdad?
- Sería bueno que nos des más código (especialmente respecto a la clase 2)
Gracias...
Dan
Hola Dan,
Gracias por tu respuesta. Desafortunadamente, cuando llamo a mi clase (clase 2) desde otra (clase 1), el sistema de clics no funciona.
Sin embargo, puedo poner en la clase 1 un listener para la clase 2, pero si sigo así voy a “sobrecargar” mi clase 1. ¿No habría forma de insertar el listener directamente en la clase 2?
Gracias por tu respuesta. Desafortunadamente, cuando llamo a mi clase (clase 2) desde otra (clase 1), el sistema de clics no funciona.
Sin embargo, puedo poner en la clase 1 un listener para la clase 2, pero si sigo así voy a “sobrecargar” mi clase 1. ¿No habría forma de insertar el listener directamente en la clase 2?
Hola Dan,
Gracias por tus respuestas. Para mí todavía es un poco duro Java, acabo de empezar.
Primero, respecto al nombre de las clases, tienes razón, es un error de mi parte. Luego, Fenetre es la clase 1 y PanImage la clase 2. Para llamar a la clase 2, hago en la declaración de variables un "private PanImage panGauche = new PanImage()," (hago lo mismo con una segunda variable llamada panDroit). Luego, hago un "panPrinc.add(panGauche, null);" (panPrinc siendo un JPanel en setLayout(null)). panGauche está posicionado en el panPrinc mediante un setBounds.
De hecho, decía que el listener de la clase 2 no funcionaba, al menos desde la clase 1. Y ese es justamente el problema. Te enviaría mis códigos completos, pero comienzan a hacerse extensos. Además, los he modificado desde mi último post para usar un listener en la clase 2 desde la clase 1 (espero que sea comprensible). Así que en la clase 1, hice "panGauche.addMouseListener(...);".
Bueno, si acaso no te lleva mucho tiempo, gracias por informarme. Me gustaría poder hacer esto, ya que aligeraría bastante mi código y lo haría más fácil de entender. Pero por ahora funciona y eso es lo principal. Por si acaso, podría enviarte las fuentes por correo.
Gracias por tus respuestas. Para mí todavía es un poco duro Java, acabo de empezar.
Primero, respecto al nombre de las clases, tienes razón, es un error de mi parte. Luego, Fenetre es la clase 1 y PanImage la clase 2. Para llamar a la clase 2, hago en la declaración de variables un "private PanImage panGauche = new PanImage()," (hago lo mismo con una segunda variable llamada panDroit). Luego, hago un "panPrinc.add(panGauche, null);" (panPrinc siendo un JPanel en setLayout(null)). panGauche está posicionado en el panPrinc mediante un setBounds.
De hecho, decía que el listener de la clase 2 no funcionaba, al menos desde la clase 1. Y ese es justamente el problema. Te enviaría mis códigos completos, pero comienzan a hacerse extensos. Además, los he modificado desde mi último post para usar un listener en la clase 2 desde la clase 1 (espero que sea comprensible). Así que en la clase 1, hice "panGauche.addMouseListener(...);".
Bueno, si acaso no te lleva mucho tiempo, gracias por informarme. Me gustaría poder hacer esto, ya que aligeraría bastante mi código y lo haría más fácil de entender. Pero por ahora funciona y eso es lo principal. Por si acaso, podría enviarte las fuentes por correo.
Hola Dan,
Tengo que hacer algo que se parece al código que me enviaste.
En la clase 2, muestro todos los puntos que han sido clickeados (estos están registrados en un ArrayList).
En la clase 1, inserto 2 objetos de la clase 2. Así, cuando hago clic en uno de estos objetos, el nuevo punto debe mostrarse en el lugar del clic y además de los puntos anteriores.
He conseguido hacer esto, todo funciona, el único problema es que no logro entender por qué el \"this.addMouseListener(new MouseAdapter()\" en la clase 2 no funciona.
De hecho, revisando mi código (varios días después y con la cabeza en frío), me pregunto si no será porque puse un void en el constructor de la segunda clase y tiene una diferencia de mayúscula (que ya me habías señalado antes): \"public void PanImage()\".
Desafortunadamente, hoy olvidé mi ordenador, no podré probar hasta esta noche. Si solo se trata de eso, te lo diré.
Gracias de todos modos una vez más por el tiempo dedicado a mi problema.
Tengo que hacer algo que se parece al código que me enviaste.
En la clase 2, muestro todos los puntos que han sido clickeados (estos están registrados en un ArrayList).
En la clase 1, inserto 2 objetos de la clase 2. Así, cuando hago clic en uno de estos objetos, el nuevo punto debe mostrarse en el lugar del clic y además de los puntos anteriores.
He conseguido hacer esto, todo funciona, el único problema es que no logro entender por qué el \"this.addMouseListener(new MouseAdapter()\" en la clase 2 no funciona.
De hecho, revisando mi código (varios días después y con la cabeza en frío), me pregunto si no será porque puse un void en el constructor de la segunda clase y tiene una diferencia de mayúscula (que ya me habías señalado antes): \"public void PanImage()\".
Desafortunadamente, hoy olvidé mi ordenador, no podré probar hasta esta noche. Si solo se trata de eso, te lo diré.
Gracias de todos modos una vez más por el tiempo dedicado a mi problema.
Hola,
Te propongo esta pequeña clase (que es un fragmento de uno de mis programas) y que muestra cómo obtener las coordenadas de un clic.
import javax.swing.*; import java.awt.*; // dont Toolkit y Graphics import java.awt.event.*; public class CoordonneesDeClic extends JFrame { //private Image img; private Color jauneclair = new Color(255, 255, 212); private int x, y; private int x1, y1; // para ... (todavía no utilizado) private int xClic, yClic; private boolean clic = false; private static Font font10; public CoordonneesDeClic() { super("Cliquer dans le cadre pour obtenir les coordonnees du clic sur la console."); // título setSize(538, 770); // dimensiones frame (redimensionnable por defecto) setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); addMouseListener(new Moustener()); } public void paint(Graphics g) { //Gráfico de las coordenadas: super.paint(g);Polygon rectangle2 = new Polygon(); // rectángulo negro rectangle2.addPoint(xClic -20, yClic -12); // punto superior izquierdo rectangle2.addPoint(xClic +22, yClic -12); // punto superior derecho rectangle2.addPoint(xClic +22, yClic +14); // punto inferior derecho rectangle2.addPoint(xClic -20, yClic +14); // punto inferior izquierdo g.setColor(Color.black); // fondo del rectángulo g.fillPolygon(rectangle2); // relleno g.drawPolygon(rectangle2); // visualización // dibujo del gráfico de las coordenadas (en blanco) g.setFont(font10); g.setColor(Color.white); g.drawString(Integer.toString(yClic), xClic -19, yClic +4); // valor de y del clic g.drawString(Integer.toString(xClic), xClic -3, yClic -4); // valor de x del clic // flechaAbscissas (x) sin la punta g.drawLine(xClic -2, yClic -1, xClic +18, yClic -1); // puntos x, y izquierda... y derecha // punta de esta flecha g.drawLine(xClic +16, yClic -3, xClic +22, yClic -1); // puntos x, y izquierda... y derecha \\ g.drawLine(xClic +16, yClic +2, xClic +22, yClic -1); // puntos x, y izquierda... y derecha / // flechaOrdenadas (y) sin la punta g.drawLine(xClic, yClic -3, xClic, yClic +9); // puntos x, y arriba... y abajo // punta de esta flecha g.drawLine(xClic -2, yClic +6, xClic, yClic +12); // puntos x, y arriba... y abajo \\ g.drawLine(xClic +2, yClic +6, xClic, yClic +12); // puntos x, y arriba... y abajo / } public static void main(String[] args) { font10 = new Font("SansSerif", Font.BOLD, 10); new CoordonneesDeClic(); } private class Moustener extends MouseAdapter { public void mouseClicked(MouseEvent evt) { clic = true; /*System.out.println("\nL 3260 mouseClicked(MouseEvent evt)\n" + " " + "w/h clic/cliquéEn/trueFalse[icop]/fig :\n" + " " + w + "/" + h + " " + clic + "/" + cliquéEn + "/" + trueFalse[icop] + "/" + fig); */ xClic = evt.getX(); yClic = evt.getY(); System.out.println("L 40 xClic/yClic: "+ xClic + "/" + yClic); repaint(); // pour afficher el gráfico de las coordenadas } } }
Cordialement,
Dan