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.
source to share
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");
}
}
}
source to share
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");
}
}
}
source to share
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.
source to share