This Java source code defines a simple mouse tracking program using Swing which is a graphical user interface toolkit. The program displays a window with a drawing surface that captures and visualizes various mouse events.
The mouse’s current coordinates, modifier keys (Shift, Control, Meta, and Alt), and the type of the most recent mouse event are displayed in real-time on the window.
The code is organized into a main class, SimpleTrackMouse, and a nested class, Display, which handles the drawing surface. Key concepts covered in the code include event handling through interfaces (MouseListener and MouseMotionListener), drawing on a panel and updating graphical components dynamically. Additionally, it introduces the use of Swing’s JPanel for GUI components.
For a novice Java programmer, this code provides a practical example of basic GUI development and event handling, offering a foundation for understanding more complex Java applications in the future.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleTrackMouse extends JPanel implements MouseListener, MouseMotionListener { Display display; // Drawing surface, defined by nested class Display. int mouse_x, mouse_y; // Position of the mouse. String modifierKeys = ""; // If non-null, gives special keys that are held down. String eventType = null; // If non-null, gives the type of the most recent mouse event. public class Display extends JPanel { // A nested class that defines the drawing surface of the applet. // This simply displays the information contained in the main class // instance variables mouse_x, mouse_y, modifierKeys, and eventType. @Override public void paintComponent(Graphics g) { // Draw the panel, showing information about mouse events. super.paintComponent(g); // Fills panel with background color. g.setColor(Color.blue); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g.drawRect(1, 1, getWidth() - 3, getHeight() - 3); g.setColor(Color.red); if (eventType == null) { // If eventType is null, no mouse event has yet occurred // on the panel, so don't display any information. return; } g.drawString("Mouse event type: " + eventType, 6, 18); if (modifierKeys.length() > 0) g.drawString("Modifier keys: " + modifierKeys, 6, 34); g.setColor(Color.black); g.drawString("(" + mouse_x + "," + mouse_y + ")", mouse_x, mouse_y); } // end of paintComponent() } // end nested class Display public SimpleTrackMouse() { // Set background color and arrange for the applet to listen for mouse events. display = new Display(); setLayout(new BorderLayout()); add(display); display.setBackground(Color.white); display.addMouseListener(this); display.addMouseMotionListener(this); } void setInfo(MouseEvent evt) { // set up the information about the event for display mouse_x = evt.getX(); mouse_y = evt.getY(); modifierKeys = ""; if (evt.isShiftDown()) modifierKeys += "Shift "; if (evt.isControlDown()) modifierKeys += "Control "; if (evt.isMetaDown()) modifierKeys += "Meta "; if (evt.isAltDown()) modifierKeys += "Alt"; display.repaint(); } // Implement all the events of the MouseListener and MouseMotionListener // interfaces. Each method sets eventType to record the type of event and // calls the setInfo method to extract other information from the event // for display. @Override public void mousePressed(MouseEvent evt) { eventType = "mousePressed"; setInfo(evt); } @Override public void mouseReleased(MouseEvent evt) { eventType = "mouseReleased"; setInfo(evt); } @Override public void mouseClicked(MouseEvent evt) { eventType = "mouseClicked"; setInfo(evt); } @Override public void mouseEntered(MouseEvent evt) { eventType = "mouseEntered"; setInfo(evt); } @Override public void mouseExited(MouseEvent evt) { eventType = "mouseExited"; setInfo(evt); } @Override public void mouseMoved(MouseEvent evt) { eventType = "mouseMoved"; setInfo(evt); } @Override public void mouseDragged(MouseEvent evt) { eventType = "mouseDragged"; setInfo(evt); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("SimpleTrackMouse"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new SimpleTrackMouse()); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } }