2012-04-01 13 views
5

Estoy trabajando con Netbeans IDE en Java.¿Cómo llamar a una función cuando hago clic en un jPanel (Java)?

Tengo un formulario con un JPanel. Cada JPanel tiene un gridLayout 3x3 y en cada lugar hay una imagen que representa un número [0,1,2,3,4,5,6,7,8] (la imagen se crea utilizando una clase personalizada, no solo ajustada la imagen en un laboratorio).

Quiero poder intercambiar dos imágenes en el panel cuando el usuario hace clic en ellas (primer clic: ninguna acción, segundo clic: cambie las dos imágenes instaladas en los componentes de jPanel).

Ya he creado una función exchangeComponents y con un código de prueba (como:

exchangeComponents (0,8,jPanel1) 

intercambia correctamente las imágenes ubicadas en Posición1 (primera fila, primera columna) y en posición2 (tercera fila, tercera columna) .

la función de un creted es la siguiente:

public void exchangeComponents(int component1,int component2,JPanel jpanel){ 
    try{ 
    Component aux1 = jpanel.getComponent(component1); 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = jpanel.getComponent(component2); 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } 
    catch (java.lang.ArrayIndexOutOfBoundsException ex){ /* error! bad input to the function*/ 
     System.exit(1); 
    } 
} 

supongo que neeed tener un evento que llaman a la función exchangeComponents() cuando el usuario c lamer en una de las imágenes en el jPanel1, pero ¿cómo debería hacerlo? y cómo verificar qué componentes (imágenes) el usuario ha seleccionado? Sólo sé que cuando creo un botón si se crea un clic sobre ella (desde el IDE) un evento como

private void button1ActionPerformed(java.awt.event.ActionEvent evt) { 
// some code.. 
} 

y se ejecuta el código de cumplimento.

Gracias de antemano por cualquier pista.

Respuesta

4

es necesario agregar el mismo detector de ratón a todo lo que los JLabels o cualquier recipiente que tiene para sus imágenes, como:

img1.addMouseListener(this); 
img2.addMouseListener(this); 

etc., Luego detecta el que ha hecho clic en JLabel con MouseEvent.getSource();, como este

boolean hasclicked1=false; 
JLabel click1label=null; 

public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), /*your jpanel here*/); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

Si no está utilizando JLabels de las imágenes, sin embargo, sustituir JLabel en el código con lo que usted está utilizando ...

EDIT: Lo siento, no creo que haya dejado esto en claro, pero su clase con el método exchangeComponents tiene que implementar MouseListener. Luego, en el evento mouseCloud ponga el código que di para él. Asegúrese de incluir las variables hasclicked1 y click1label en su clase. Haga que su clase sea algo como esto

public class ComponentExchanger implements MouseListener { 
boolean hasclicked1=false; 
JLabel click1label=null; 
JPanel mainPanel; 
public ComponentExchanger(){ 
    //create JFrame, JPanel, etc. 
    JFrame f=new JFrame(); 
    //etc. 
    mainPanel=new JPanel(); 
    f.add(mainPanel); 
    //set layout of panel, etc. 
    for(int i=0;i<9;i++){ 
     JLabel l=new JLabel(/*label image here*/); 
     Point loc=new Point(/*coordinates here*/); 
     l.setLocation(loc); 
     mainPanel.add(l); 
     /*more code*/ 
     f.setVisible(true); 
    } 
} 

public static void main(String args[]){ 
    new ComponentExchanger(); 
} 


public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), mainPanel); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

//Also, you will need to include the other mouselistener implemented methods, just 
//leave them empty 
} 
+0

Gracias. Está muy claro ... pero con img1.addMouseListener (esto); Paso el formulario itselft y dice "Error: MouseListener esperado". ¿Y qué? – dragonmnl

+0

bueno, lo hice (hice una clase getComponent implementando MouseListener) y usando img1.addMouseListener (new ComponentListener()). El problema ahora es ... Agregué un oyente para cada componente, pero cuando hago clic en cualquier componente (Imagen) el evento no se desencadena en absoluto – dragonmnl

+0

Lo siento, no creo que lo haya dejado muy claro, pero su clase necesita implementar MouseListener, entonces necesita agregar el oyente a cada uno de sus componentes que están siendo cambiados. @dragonml – DankMemes

1

En primer lugar, para ser técnico es métodos no funciona. Hay un par de formas en que puede hacer esto. Podrías seguir con actionListener, pero probablemente necesitarías botones o algo. O podría utilizar MouseListener y detectar clics en una región determinada del panel. Para el algoritmo de conmutación, quizás una matriz de 2 imágenes. Hay una variable que aumenta en 1 cada clic. Cuando la variable es 2, se restablece de nuevo a 0.

clicks++; //every time the mouse is clicked; clicks starts out at 0 
if(clicks == 2){ 
clicks = 0; //at the end of the listener method 
} 

En el primer clic en la imagen se hace clic entra en la primera ranura de matriz, debido a que el usuario ha hecho clic una vez.

clickImage = imageArray[clicks]; 

En el segundo clic, la otra imagen clicada va a la segunda ranura de matriz, porque se han detectado 2 clics. En este caso, su método exchangeComponents iría al final del método listener, con los argumentos siendo imageArray [1], imageArray [2],.

Puede aplicar esto a ints o lo que sea, solo guarde el valor en una matriz y use una variable incremental y de restablecimiento.

Cuestiones relacionadas