私はこの問題を抱えています。私はパズルゲームをしなければなりません。これには、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);
}
}//:)