0

私はこの問題を抱えています。私はパズルゲームをしなければなりません。これには、BorderLAyoutを持つメインJPanel(PPal)があります。北にはパズルのピースを持った別のJPanel(PPiezas)があります。2つのマウスイベントがあります。1つ(ClickSobrePieza)は、ピースパネルのクリックで動作してピースを選択します。

これは問題なく動作します。次に、メインパネルに別のマウスイベント(RatonMueve)を追加しました。これは、すべてのマウスモーションをリッスンすることになっています。選択したピースがある場合は、マウスを移動するときにメインパネル上に移動します。ここでの問題は、このイベントが機能しないことです。コードにも入力されません。PPalパネルでsetFocusable()とrequestFocusable()を試してみましたが、効果がありません。なぜそれが起こっているのか誰もが知っていますか?

package GUI;

import data.Pieza;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JLayeredPane;
import javax.swing.event.MouseInputAdapter;

/**
*
 * @author rootmobil
 */
public class PPal extends JLayeredPane{
private VPal v;//that's JFrame, it contains this panel
private PPiezas pPiezas;//thats the JPanel in the NORTH
private PHuecos pHuecos;//that's a JPanel in CENTRE
private Pieza piezaMostrada;//that's the piece should be showed and moved, It's the piece user choose
private Point p;//that's the point that will contain the mouse pointer position and will mark where must be piezaMostrada each time
        
public PPal(VPal v) {
    this.v=v;
    
    this.setFocusable(true);
    this.requestFocus();
    this.addMouseMotionListener(new RatonMueve());
    
    this.setLayout(new BorderLayout());
    
    this.pPiezas=new PPiezas(v);
    this.pHuecos=new PHuecos(v);
    
    this.moveToBack(this.pPiezas);
    this.moveToBack(this.pHuecos);
    
    this.pPiezas.addMouseListener(new ClickSobrePieza());
    this.add(pPiezas,BorderLayout.NORTH,1);
    this.add(new PHuecos(v),BorderLayout.CENTER,1);
 
}

   class RatonMueve extends MouseInputAdapter{
    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("algo");//I put that to see if program enter into this code, it never does
        if (v.getJuego().getPiezaAMostrar()!=null) {
            piezaMostrada=new Pieza(v.getJuego().getPiezaAMostrar().getImgPath(),v.getJuego().getPiezaAMostrar().getPosicion());//that creates piezaMostrada from the selected one in the north panel
            PPal.this.moveToFront(piezaMostrada);
            piezaMostrada.setLocation(p.x,p.y);
            PPal.this.add(piezaMostrada);
        }
        
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        p=new Point(e.getX(),e.getY());
        if (piezaMostrada!=null) {
            piezaMostrada.setLocation(p.x,p.y);
            PPal.this.repaint();
        }
    }
}

   //this is where I take the selected piece by the user, this code works perfect
   class ClickSobrePieza extends MouseAdapter{
    Point p;

    @Override
    public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        p=e.getPoint();
        
        if (e.getComponent().getComponentAt(p).getClass()==Pieza.class){
            if (v.getJuego().getPiezaSeleccionada()!=null) {
               v.getJuego().getPiezaSeleccionada().setEnabled(true); 
            }
            v.getJuego().setPiezaSeleccionada((Pieza)e.getComponent().getComponentAt(p));
            v.getJuego().setPiezaAMostrar(new Pieza(v.getJuego().getPiezaSeleccionada().getImgPath(),
                                                        v.getJuego().getPiezaSeleccionada().getPosicion()));
            
            v.getJuego().getPiezaSeleccionada().setEnabled(false);
        }
    }
    
    
}

   //draws a background image 
   @Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(new ImageIcon("./res/fondo.jpg").getImage(),0,0,this.getWidth(),this.getHeight(),null);
}

}//:)
4

0 に答える 0