How to test the mouse Click in 2D Graphics java.

I need to do some code that will draw a triangle. then the user will click inside or outside the triangle. and the dialog box will show "Click is inside triangle" if it is.

I have the code to draw a triangle, here is the code, now what to do. I do not know. if anyone can help please please.

I tried the axis base but I didn't come up with the required result.

public void paintComponent(Graphics g)  
        {  
            Graphics2D g2 = (Graphics2D) g;  
            g2.draw(new Line2D.Double (150, 200, 200, 100)); 
            g2.draw(new Line2D.Double (100, 100, 150, 200));           
            g2.draw(new Line2D.Double (100, 100, 200, 100)); 
        }  

      

The exit is here. enter image description here

+3


source to share


3 answers


The class Shape

is what you want to use. Instead of drawing the triangle by hand (with separate operators draw

for each row), create an object Shape

that represents the triangle. A Polygon

will be enough to create triangles.

Instead of changing the JFrame's picture, it is better to consider creating a custom colored panel and adding it to the frame.



public class YourFrame extends JFrame { //Replace with your class name, obviously

    public YourFrame(){
        //Create and add trianglePanel
        setLayout(new BorderLayout());
        add(new TrianglePanel(), BorderLayout.CENTER);
        pack();
        repaint();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    class TrianglePanel extends JPanel implements MouseListener{
        private Polygon triangle;

        public TrianglePanel(){
            //Create triangle
            triangle = new Polygon();
            triangle.addPoint(150, 200);
            triangle.addPoint(100, 100);
            triangle.addPoint(200, 100);

            //Add mouse Listener
            addMouseListener(this);

            //Set size to make sure that the whole triangle is shown
            setPreferredSize(new Dimension(300, 300));
        }

        /** Draws the triangle as this frame painting */
        public void paintComponent(Graphics g){
            Graphics2D g2d = (Graphics2D)g;
            g2d.draw(triangle);
        }

        //Required methods for MouseListener, though the only one you care about is click
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}

        /** Called whenever the mouse clicks.
          * Could be replaced with setting the value of a JLabel, etc. */
        public void mouseClicked(MouseEvent e) {
            Point p = e.getPoint();
            if(triangle.contains(p)) System.out.println("Triangle contains point");
            else System.out.println("Triangle Doesn't contain point");
        }
    }
}        

      

+1


source


Final code using @Mshink



 public class Triangle_shape extends JFrame {
        /**
         * @param args the command line arguments
         */
        public Triangle_shape(){
            //Create and add trianglePanel

          //  setVisible(true);
        //    setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
      public static void main(String[] args) {

            // TODO code application logic here
          TrianglePanel t= new TrianglePanel();
        JFrame frame = new JFrame ();  
        final int FRAME_WIDTH = 500;  
        final int FRAME_HEIGHT = 500;

        frame.setSize (FRAME_WIDTH, FRAME_HEIGHT);           

        frame.setLayout(new BorderLayout());
          frame.add(t);
        //    frame.add(new TrianglePanel(), BorderLayout.CENTER);
            frame.pack();
            frame.repaint();
            frame.setTitle("A Test Frame");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        frame.setVisible(true);  

        }
       public static class TrianglePanel extends JPanel implements MouseListener{
            private Polygon triangle;

            public TrianglePanel(){
                //Create triangle
                triangle = new Polygon();
                triangle.addPoint(150, 200);
                triangle.addPoint(100, 100);
                triangle.addPoint(200, 100);

                //Add mouse Listener
                addMouseListener(this);

                //Set size to make sure that the whole triangle is shown
                setPreferredSize(new Dimension(300, 300));
            }

            /** Draws the triangle as this frame painting */
            public void paintComponent(Graphics g){
                Graphics2D g2d = (Graphics2D)g;
                g2d.draw(triangle);
            }

            //Required methods for MouseListener, though the only one you care about is click
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}

            /** Called whenever the mouse clicks.
              * Could be replaced with setting the value of a JLabel, etc. */
            public void mouseClicked(MouseEvent e) {
                Point p = e.getPoint();
                if(triangle.contains(p)) System.out.println("Triangle contains point");
                else System.out.println("Triangle Doesn't contain point");
            }




        }
    }

      

0


source


This should do the job. It's not the best option, nor the one with the best performance, but it works.

// The main class which makes the frame and adds the necessary stuff
class Mainclass {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(400,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        CPanel panel = new CPanel();

        // I like colours
        panel.setBackground(new Color(255,255,255,255));
        frame.add(panel);

        frame.addMouseListener(new Mouse(panel));

        frame.setVisible(true);
    }
}

// The MouseListener which checks if the mouse is clicked
class Mouse implements MouseListener {

    CPanel panel;

    public Mouse(CPanel panel) {
        this.panel=panel;
    }


    @Override
    public void mouseClicked(MouseEvent e) {
        int x=e.getX();
        int y=e.getY();

        boolean inside=false;

        ArrayList<Integer> Ys = panel.coordinates.get(x);
        if(Ys != null) {
            if(panel.coordinates.get(x).contains(y)) {
                inside=true;
            }
        }

        if(inside) {
            System.out.println("You clicked in the triangle");
        } else {
            System.out.println("You clicked out of the triangle");
        }

    }

    @Override   public void mousePressed  (MouseEvent e) {}
    @Override   public void mouseReleased (MouseEvent e) {}
    @Override   public void mouseEntered  (MouseEvent e) {}
    @Override   public void mouseExited   (MouseEvent e) {}
}

// The panel
class CPanel extends JPanel {

    public int minX=100;
    public int maxX=200;
    public int minY=100;
    public int maxY=200;

    // All the pixels in the triangle
    HashMap<Integer, ArrayList<Integer>> coordinates = new HashMap<Integer, ArrayList<Integer>>();


    public void paintComponent(Graphics G) {
        super.paintComponent(G);

        /** For that one downvoter: I made it G2D, even though it makes no difference **/
        Graphics2D g = (Graphics2D) G;

        // Drawing a centered triangle
        int xCen=(int)Math.round((minX+maxX)/2.0);

        // I like colours
        g.setColor(new Color(0,0,255,128));

        for(int y=0; y<=maxY-minY; y++) {

            int x0=xCen-y;
            int x1=xCen+y;

            int y0=y+minY;

            for(int x=x0; x<=x1; x++) {
                // Adding all pixels in this row to 'coordinates'
                ArrayList<Integer> Ys = coordinates.get(x);

                if(Ys==null) {
                    coordinates.put(x, new ArrayList<Integer>());
                    Ys = coordinates.get(x);
                }

                Ys.add(y0);
                coordinates.put(x, Ys);
            }

            // Draw the row
            g.drawLine(x0,y0,x1,y0);
        }

        // Output the coordinates for debugging purposes
        System.out.println(coordinates);
    }
}

      

Again, if you want something with better performance, don't use that.

-1


source







All Articles