我有單獨的類來處理鼠標監聽器。但是當我從另一個班級使用它時,它不工作,我不知道如何解決這個問題。在這裏我Handler類:MouseListener在單獨的類不工作
some import stuff
public class Handler implements MouseListener, MouseMotionListener {
private final Canvas canvas;
public Handler(Canvas targetCanvas) {
this.canvas = targetCanvas;
}
// recasting exception
public Canvas getTargetCanvas() {
return canvas;
}
...
...
@Override
public void mouseDragged(MouseEvent e) {
// recasting exception
DrawingCanvas dC = (DrawingCanvas) getTargetCanvas();
dC.setMouseDragged(true);
}
@Override
public void mouseMoved(MouseEvent e) {
// recasting exception
DrawingCanvas dCanvas = (DrawingCanvas) getTargetCanvas();
dCanvas.setMouseClicked(true);
dCanvas.setMouseCoordinates(e.getPoint());
}
}
DrawingCanvas類:
some import stuff
public class DrawingCanvas extends Canvas {
private boolean isMouseDragged, isMouseMoved;
private Point mouseCoordinates;
public DrawingCanvas() {
this.setPreferredSize(new Dimension(790, 500));
this.setBackground(Color.WHITE);
}
public Point getMouseCoordinates() {
return mouseCoordinates;
}
public boolean isIsMouseDragged() {
return isMouseDragged;
}
public boolean isIsMouseMoved() {
return isMouseMoved;
}
...
...
public void setMouseDragged(boolean dragged) {
isMouseDragged = dragged;
}
public void setMouseMoved(boolean moved) {
isMouseMoved = moved;
}
public void setMouseCoordinates(Point coordinates) {
mouseCoordinates = coordinates;
}
}
狀態欄類:
some import stuff
public class StatusBar extends JPanel {
private JLabel statusBar;
public StatusBar() {
statusBar = new JLabel();
this.setPreferredSize(new Dimension(500, 30));
this.setBackground(new Color(242,241,240));
this.add(statusBar, new BorderLayout(5,0));
}
public JLabel getStatusBar() {
return statusBar;
}
public void setStatusBar(JLabel statusBar) {
this.statusBar = statusBar;
}
}
而且MouseEventGUI類:
some import stuff
public class MouseEventGUI extends JFrame {
private DrawingCanvas drawingCanvas;
private StatusBar statusBar;
private MenuBar menuBar;
public MouseEventGUI() {
super("Learn Mouse Event");
drawingCanvas = new DrawingCanvas();
statusBar = new StatusBar();
menuBar = new MenuBar();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(750, 560));
this.add(menuBar, BorderLayout.NORTH);
this.add(drawingCanvas, BorderLayout.CENTER);
this.add(statusBar, BorderLayout.SOUTH);
this.addMouseListener(new Handler(drawingCanvas));
this.addMouseMotionListener(new Handler(drawingCanvas));
if(drawingCanvas.isIsMouseMoved()){
statusBar.getStatusBar().setText(String.format("%d, %d",
drawingCanvas.getMouseCoordinates().x,
drawingCanvas.getMouseCoordinates().y));
} else {
statusBar.getStatusBar().setText("Mouse is not listened.");
}
}
}
當我運行該程序,在狀態欄顯示「鼠標沒有被監聽「(見MouseEventGUI類),我希望它顯示鼠標光標的座標,如果我在畫布中移動它。
[更新]
如果在相同的類,它工作以及經過一些修改。這裏DrawingCanvas類的代碼:
public class DrawingCanvas extends JPanel {
private boolean isMouseClicked,
isMouseMoved;
private Point mouseCoordinates;
protected StatusBar statusBar;
protected MenuBar menuBar;
public DrawingCanvas(StatusBar st) {
setPreferredSize(new Dimension(790, 500));
setBackground(Color.WHITE);
statusBar = st;
Handlers handlers = new Handlers();
addMouseListener(handlers);
addMouseMotionListener(handlers);
}
**// inner class**
protected class Handlers extends MouseAdapter implements MouseListener, MouseMotionListener {
@Override
public void mouseClicked(MouseEvent e) {
statusBar.getStatusBar().setText("Mouse clicked.");
}
@Override
public void mouseMoved(MouseEvent e) {
statusBar.getStatusBar().setText(String.format("%d, %d", e.getX(),e.getY()));
}
}
}
和這裏MouseEventGUI類:
public class MouseEventGUI extends JFrame {
private DrawingCanvas drawingCanvas;
private StatusBar statusBar;
private MenuBar menuBar;
public MouseEventGUI() {
super("Learn Mouse Event");
statusBar = new StatusBar();
menuBar = new MenuBar();
drawingCanvas = new DrawingCanvas(statusBar);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(750, 560));
this.add(menuBar, BorderLayout.NORTH);
this.add(drawingCanvas, BorderLayout.CENTER);
this.add(statusBar, BorderLayout.SOUTH);
}
}
不過,我計劃把它在不同的類可重複使用的原因。
請定義我們你所說的 「它不工作」 是什麼意思?你已經拋棄了很多代碼,並提供了很少的描述。請幫助我們更好地瞭解您的代碼和問題,以便我們能夠更好地幫助您。順便說一句:爲什麼是AWT而不是Swing?此外,你的MouseListener似乎沒有做任何可衡量的事情。 –
@Hovercraft:我已經約會了我的貼子 –
爲了更好地幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)。如果它在***相同類中,它是否工作?這是你應該首先檢查的東西。 KeyListener類因失敗而臭名昭着。而且,對於Swing,通常使用基於AWT的較低級別的KeyListener上的鍵綁定。有關如何使用它們的詳細信息,請參見[如何使用鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 –