0

I'm trying to make a simle java program that draws a circle at the mouse localization, it gets the mouse X and Y coordinates but it doesn't draw anything, i tried to draw a String, a circle and a line but nothing worked, i changed the code a bit but it still doesn't works

class Test4 {

public static String a;
public static JFrame frame = new JFrame();  

 public static Point Gett(){
 PointerInfo h = MouseInfo.getPointerInfo();
 Point b = h.getLocation();
 return b;
 }

public void paintComponent(int x, int y, Graphics g) {
    g.drawOval(x, y, 10, 10);
}

public static void main(String[] args) throws InterruptedException {
    int h = 250;
    int f = 200;
    frame.setVisible(true);
    frame.setSize(h, f);
    frame.setLocationRelativeTo(null);
    while(true){
    Point b = Gett();
    int x = (int) b.getX();
    int y = (int) b.getY();
    System.out.println(x);
    System.out.println(y);
    frame.repaint();}}}
  • 1
    Why don't you use a `MouseListener` instead of useless infinite loops? It will give you the accurate mouse position relative to the frame, not to the desktop. – BackSlash Sep 16 '13 at 19:56
  • See the related examples [here](http://stackoverflow.com/a/5312702/230513) and [here](http://stackoverflow.com/a/15576413/230513). – trashgod Sep 16 '13 at 19:58
  • You can not draw directly on JFrame. See the answer to [this](http://stackoverflow.com/questions/8077156/paintcomponent-never-executes-on-a-jframe) question. – PM 77-1 Sep 16 '13 at 20:13
  • 2
    Custom painting is done by overriding the paintComponent of a JPanel (or JComponent). You don't just create a method by that name and add it to your class. Also, you should not be using static variables. Read the Swing tutorial for the basics of [Custom Painting](http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html). – camickr Sep 16 '13 at 20:32

1 Answers1

0
  • Don't perform custom painting directly on a JFrame. Always do it on a JComponent overriding the paintComponent method if you can.

  • Don't use an infinite loop for this purpose. There is the MouseMotionListener for Mouse Motion listening


public class Test4 {

    public static String a;
    public static CustomDrawingPanel content;
    public static JFrame frame = new JFrame();
    final static int OVAL_WIDTH = 10;
    final static int OVAL_HEIGHT = 10;
    static int x = -20, y = -20;
    public static MouseMotionListener listener = new ContentListener();

    public static void main(String[] args) throws InterruptedException {
        int h = 250;
        int f = 200;
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        content = new CustomDrawingPanel();
        content.addMouseMotionListener(listener);
        frame.add(content);

        frame.getContentPane().setPreferredSize(new Dimension(h, f));
        frame.pack();
        frame.setLocationRelativeTo(null);

        frame.setVisible(true);
    }

    //class that performs custom drawing
    static class CustomDrawingPanel extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);  //Always call this
            g.drawOval(x, y, 10, 10);
        }
    }

    //listener to the mouse motion
    static class ContentListener implements MouseMotionListener {

        @Override
        public void mouseDragged(MouseEvent e) {
            mouseMoved(e); //if you delete this line, when you drag your circle will hang
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            x = e.getX() - OVAL_WIDTH / 2;
            y = e.getY() - OVAL_HEIGHT / 2;
            content.repaint();
        }
    }
}
BackSlash
  • 21,927
  • 22
  • 96
  • 136