I have separate class to handle mouse listener. But it not working when I use it from another class and I don't know yet how to solve this. Here my Handler class:
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 class:
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;
}
}
StatusBar class:
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;
}
}
And MouseEventGUI class:
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.");
}
}
}
when i run the program, in status bar show "Mouse is not listened" (see in MouseEventGUI class) that I wish it show the coordinates of mouse cursor if I moved it in canvas.
[update]
if in the same class, it work well with some modification. Here the code for DrawingCanvas class:
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()));
}
}
}
and here for MouseEventGUI class:
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);
}
}
But, I plan to make it in separate class for reusable reason.