Java 鼠标单击坐标仅第一次出现,其他坐标始终相同

Java 鼠标单击坐标仅第一次出现,其他坐标始终相同,java,swing,Java,Swing,我正在制作一个程序,在点击的地方画圆圈 第一次单击时,它绘制的圆圈与我单击的位置不完全相同 但是,对于其他点击,它只是一个接一个地画圆圈。我发现这是因为点击的坐标不会改变 我的主要意见是: public static void main(String[] args) { JFrame frame = new JFrame(); //set window size frame.setSize(1000, 1000); //set the title frame.set

我正在制作一个程序,在点击的地方画圆圈

第一次单击时,它绘制的圆圈与我单击的位置不完全相同

但是,对于其他点击,它只是一个接一个地画圆圈。我发现这是因为点击的坐标不会改变

我的主要意见是:

public static void main(String[] args)
{
   JFrame frame = new JFrame();
   //set window size
   frame.setSize(1000, 1000);
   //set the title
   frame.setTitle("Oval Draw");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   //add panel to frame and make it visible
   MouseComponent component = new MouseComponent();
   frame.add(component);
   frame.setVisible(true);        
}
以及MouseComponent类:

public class MouseComponent extends JPanel implements MouseListener
{
        boolean drawPoint = true;
        boolean drawLine = false;
        boolean drawOval = false;

    public MouseComponent()
    {
        super();
        pointX = 0;
        pointY = 0;   
        lineX = 0;
        lineY = 0;
        addMouseListener(this);
    }

    int pointX, pointY, lineX, lineY;
    int[] ArrayX,ArrayY;         

    @Override
    public void paintComponent(Graphics g)
    {
        for(int i=0; i<10; i++)
        {
            super.paintComponent(g);
             if(drawLine)
            {
                int red = (int) (Math.random() * 255);
                int green = (int) (Math.random() * 255);
                int blue = (int) (Math.random() * 255);
                Color startrandomColor = new Color(red, green, blue);

                red = (int) (Math.random() * 255);
                green = (int) (Math.random() * 255);
                blue = (int) (Math.random() * 255);
                Color endrandomColor = new Color(red, green, blue);

                Graphics2D g2d = (Graphics2D) g;
               // this.addMouseListener(this);
                GradientPaint gradient = new GradientPaint(70, 70, startrandomColor,
                150, 150, endrandomColor);

                g2d.setPaint(gradient);
                g2d.translate( lineX, lineY);
                g2d.fillOval(70, 70, 100, 100);
                System.out.print(lineX);
                System.out.print(" ");
                System.out.print(lineY);
                System.out.print(" ");
                System.out.print(pointX);
                System.out.print(" ");
                System.out.print(pointY);
                System.out.print(" ");
                // repaint();
            }
            else if(drawPoint)
            {
              //  g.drawOval(pointX-5,pointY-5,10,10);
            }
        }
    }

    public void mouseClicked(MouseEvent mouse)
    {
        if(!drawPoint)    
        {
        pointX = mouse.getX();
        pointY = mouse.getY();
        drawPoint = true;   
        }    

        else if(!drawLine)   
        {
        lineX = mouse.getX();
        lineY = mouse.getY();
        drawLine = true;    
        }
        repaint();
    }
    public void mouseEntered(MouseEvent mouse){ }   
    public void mouseExited(MouseEvent mouse){ }
    public void mousePressed(MouseEvent mouse){ }
    public void mouseReleased(MouseEvent mouse){ }
}
公共类MouseComponent扩展JPanel实现MouseListener
{
布尔值drawPoint=true;
布尔绘制线=假;
布尔值=假;
公共鼠标组件()
{
超级();
点x=0;
pointY=0;
lineX=0;
lineY=0;
addMouseListener(这个);
}
int pointX,pointY,lineX,lineY;
int[]ArrayX,ArrayY;
@凌驾
公共组件(图形g)
{
对于(int i=0;i这里:

 if(!drawPoint)    
    {
    pointX = mouse.getX();
    pointY = mouse.getY();
    drawPoint = true;   
    }    
没有太多意义。您将drawPoint初始化为
true
…这样您就不会输入if块并收集单击坐标

除此之外,当你研究你的另一种方法时,画点的代码被注释掉了

建议:退后一步;不要试图同时做5件事。编写完成这5件事所需的代码

  • 单击后获取鼠标坐标
  • 围绕那个坐标画圆圈
然后让它开始工作。暂时忘记画线,形状,任何东西

当你有一个只做点击+画圈的类,然后创建一个新的类,在那里你可以添加更多的功能。你现在“真正”的问题是你开始研究各种功能;你试图“集成”把它们放在一个单独的课堂上会让你感到困惑,这并不奇怪……不起作用

长话短说:忘记了你的代码中现在有一个奇怪的逻辑,在绘图点和线之间“切换”。绘制点。然后,当这起作用时……添加一些单选按钮;或一个下拉菜单,并使用来控制你是否要绘制线或点。不要让它“隐式”通过在事件处理程序代码中切换布尔值!

这里:

 if(!drawPoint)    
    {
    pointX = mouse.getX();
    pointY = mouse.getY();
    drawPoint = true;   
    }    
没有太多意义。您将drawPoint初始化为
true
…这样您就不会输入if块并收集单击坐标

除此之外,当你研究你的另一种方法时,画点的代码被注释掉了

建议:退后一步;不要试图同时做5件事。编写完成这5件事所需的代码

  • 单击后获取鼠标坐标
  • 围绕那个坐标画圆圈
然后让它开始工作。暂时忘记画线,形状,任何东西

当你有一个只做点击+画圈的类,然后创建一个新的类,在那里你可以添加更多的功能。你现在“真正”的问题是你开始研究各种功能;你试图“集成”把它们放在一个单独的课堂上会让你感到困惑,这并不奇怪……不起作用


长话短说:忘记了你的代码中现在有一个奇怪的逻辑,在绘图点和线之间“切换”。绘制点。然后,当这起作用时……添加一些单选按钮;或一个下拉菜单,并使用来控制你是否要绘制线或点。不要让它“隐式”通过在事件处理程序代码中切换布尔值!

boolean drawPoint=true;

boolean drawLine=false;
使其第一次打印。之后两者都设置为true,因此不会更改坐标。

boolean drawPoint=true;

boolean drawLine=false;
使其第一次打印。之后这两个参数都设置为true,因此它不会改变坐标。

因此,第一次查看时,您将声明布尔值
drawPoint
drawLine
。在鼠标事件上,您对这些布尔值进行了否定测试。在第一次单击时,他将进入绘制线因为false变为true,drawPoint也会变为true。之后在MouseeEvent中,两者的计算结果都将变为true,并将变为false。您不会得到新的X和Y。除此之外,您希望其他人花时间帮助您。因此,请您花时间对所有源代码进行良好的格式化/缩进。为了更快地获得更好的帮助,请发布或。因此,第一次查看时,您声明布尔值
drawPoint
drawLine
。在MouseeEvent上,您对这些布尔值进行了阴性测试。在第一次单击时,他将进入drawLine,因为false变为true,drawPoint变为false。之后,这两个布尔值将在MouseeEvent中计算为true,并在MouseeEvent中变为false。您不要像看上去那样得到新的X和Y。除此之外:你希望其他人花时间来帮助你。因此,请你花时间好好格式化/缩进你的所有源代码。为了更快地获得更好的帮助,请发布一个or。因为你的答案非常有建设性和详细。你介意包括我的评论吗?(如果是真的)在我看来,这也是一个逻辑错误,因为如果你查看变量
drawPoint
drawLine
以及它们在mouseClicked中的检查方式,
mouseClicked
在第一次单击后将永远不会做任何事情。@Nico:我重新编写了一点,并添加了。谢谢你的输入;-)由于你的回答非常有建设性和详细,你介意包括我的评论吗?(如果是真的)在我看来,这也像是一个逻辑错误,因为如果你查看变量
drawPoint
drawLine
以及它们在mouseClicked中的检查方式,
mouseClicked
在第一次单击后将永远不会做任何事情。@Nico:我重新编写了一点,并添加了。谢谢你的帮助