Evento de ratón en un JPanel (Java)

Resuelto
csi_bern Mensajes publicados 72 Estado Miembro -  
 danimo -
Hola,

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

danimo
 
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
1
csi_bern Mensajes publicados 72 Estado Miembro 2
 
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?
0
csi_bern Mensajes publicados 72 Estado Miembro 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.
0
danimo
 
Hola,

Antes de sumergirme en tus clases, me gustaría que me hagas un resumen de lo que tienes que hacer (aparte de mostrar las coordenadas del clic), porque confieso que para mí no está claro... gracias.

Saludos,

Dan
0
csi_bern Mensajes publicados 72 Estado Miembro 2
 
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.
0
danimo
 
« Me pregunto si no es que es por haber puesto un void en mi constructor ... »

Los constructores no tienen valor de retorno, por defecto son void, ya se indique o no, así que no creo que el problema venga por la presencia de void...

Dan
0
csi_bern Mensajes publicados 72 Estado Miembro 2
 
Hola,

De hecho sí, el problema venía del constructor porque ahora funciona. Si no es necesariamente de void, tenía que ver con que tenía una diferencia de mayúscula entre la clase y el constructor.

¡Este tipo de pequeños errores que no se ven te hacen odiar la programación a veces!
0
danimo
 
¿Habías dejado la clase panImage sin mayúscula en P?
Entonces no era un constructor sino un método void...

Pero no tengo suficiente código para ver la incidencia porque no había un retorno posible.

En fin, si funciona es lo esencial.


@++

Dan
0
danimo
 
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
-1