Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何使我的鼠标按下的听者只在我点击某个区域时才响应?_Java_User Interface_Graphics - Fatal编程技术网

Java 我如何使我的鼠标按下的听者只在我点击某个区域时才响应?

Java 我如何使我的鼠标按下的听者只在我点击某个区域时才响应?,java,user-interface,graphics,Java,User Interface,Graphics,我创建了一个简单的GUI,它有两个圆圈和两个正方形。单击鼠标时,形状将变为随机颜色。我想我的形状只改变颜色时,鼠标已经点击了形状内。此外,目前所有4个形状都会改变颜色,但我希望每个形状都能根据单击的形状独立改变颜色 package weekThree; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Re

我创建了一个简单的GUI,它有两个圆圈和两个正方形。单击鼠标时,形状将变为随机颜色。我想我的形状只改变颜色时,鼠标已经点击了形状内。此外,目前所有4个形状都会改变颜色,但我希望每个形状都能根据单击的形状独立改变颜色

package weekThree;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.*;

@SuppressWarnings("serial")
public class taskTwo2 extends JPanel {
    private static final int PREF_W = 200;
    private static final int PREF_H = PREF_W;
    private Color circleColor = Color.RED;   //starting colour
    private Color circleColor2 = Color.BLUE;
    private Color squareColor = Color.GREEN;
    private Color squareColor2 = Color.YELLOW;
    private int circX  = 10;
    private int circY = circX;
    private int circW = PREF_W - 2 * circX;
    private int circH = PREF_H - 2 * circY;

    public taskTwo2() {
        addMouseListener(new MyMouse()); //mouse click listener
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // to smooth out graphics
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //smoothes out edges

        g2.setColor(circleColor);
        g2.fillOval(circX, circY, circW, circH);
        g2.setColor(Color.BLACK);
        g2.drawOval(circX, circY, circW, circH);


        g2.setColor(circleColor2);
        g2.fillOval(25*(circX), 25*(circY), circW, circH);
        g2.setColor(Color.BLACK);
        g2.drawOval(25*(circX), 25*(circY), circW, circH);


        g2.setColor(squareColor);
        g2.fillRect(circX, 25*(circY), circW, circH);
        g2.setColor(Color.BLACK);
        g2.drawRect(circX, 25*(circY), circW, circH);


        g2.setColor(squareColor2);
        g2.fillRect(25*(circX), circY, circW, circH);
        g2.setColor(Color.BLACK);
        g2.drawRect(25*(circX), circY, circW, circH);
    }

    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private class MyMouse extends MouseAdapter {
        Random rand = new Random();

        @Override
        public void mousePressed(MouseEvent e) {
            float red = rand.nextFloat();       //generates a random value for the red tint value
            float green = rand.nextFloat();
            float blue = rand.nextFloat();
            circleColor = new Color(red, green, blue);

            float red2 = rand.nextFloat();
            float green2 = rand.nextFloat();
            float blue2 = rand.nextFloat();
            circleColor2 = new Color(red2, green2, blue2);

            float red3 = rand.nextFloat();
            float green3 = rand.nextFloat();
            float blue3 = rand.nextFloat();
            squareColor = new Color(red3, green3, blue3);

            float red4 = rand.nextFloat();
            float green4 = rand.nextFloat();
            float blue4 = rand.nextFloat();
            squareColor2 = new Color(red4, green4, blue4);

            repaint();   //repaint components
        }
    }

    private static void createAndShowGui() { //code for GUI visuals
        JFrame frame = new JFrame("MyTaskToo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new taskTwo2());
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

谢谢

通过使用
Point mouseLocation=e.getPoint(),您可以在
mousePressed()
方法中获取鼠标位置然后您必须检查鼠标是否在圆的边界内。这个方程就是从圆心开始的距离:

/**
 * Checks if the mouse location is within the circle
 * @param mouseLocation the location of the mouse
 * @param cX circle center X location
 * @param cY circle center Y location
 * @param cR circle radius
 * @return true if the mouse is no more than cR units away from the center of the circle 
 */
private static boolean isInCircle(Point mouseLocation, double cX, double cY, double cR){
    final double dX = mouseLocation.getX()-cX;
    final double dY = mouseLocation.getY()-cY;
    return Math.sqrt(dX*dX+dY*dY)<=cR;
}
正方形的代码类似,但它使用了

    if(isInCircle(mouseLocation,circX+circW/2,circY+circH/2,circW/2)){
            float red = rand.nextFloat();       //generates a random value for the red tint value
            float green = rand.nextFloat();
            float blue = rand.nextFloat();
            circleColor = new Color(red, green, blue);
        }