MouseClick坐标仅在第一次出现,对于其他坐标始终相同

时间:2017-02-28 12:30:15

标签: java swing

我正在制作一个在点击的位置绘制圆圈的程序。

首次点击时,它会绘制一个圆圈,这个圆圈与我点击的地方并不完全相同。

但是,对于其他点击,它只是在另一个上绘制圆圈。因为我发现这是因为点击的坐标不会改变。

我的主要:

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){ }
}

2 个答案:

答案 0 :(得分:2)

这里:

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

根本没有太多意义。您将drawPoint初始化为true ...因此您将从不输入if块并收集点击坐标。

除此之外:当你研究另一种方法时 - 绘制点的代码是注释掉

建议:退一步;不要试图同时做5件事。将代码写入

  • 点击后获取鼠标坐标
  • 围绕该坐标绘制圆圈

工作。忘记绘制线条,形状,现在

当你有一个除了点击+绘制圆圈之外什么都不做的课程;然后创建一个类,您可以在其中添加更多功能。你真实的&#34;现在的问题是你开始研究各种功能;并且你试图整合&#34;他们进入一个单独的课程让你感到困惑,并不奇怪......不工作!

长话短说:忘记你现在代码中的那种奇怪的逻辑,以及#34;切换&#34;在绘图点和线之间。画点。然后,当它工作时...添加一些单选按钮;或下拉菜单,并使用 来控制是否要绘制线条或点。不要做那&#34;隐含&#34;通过在事件处理程序代码中切换布尔值!

答案 1 :(得分:1)

boolean drawPoint = true;  boolean drawLine = false;导致它第一次打印。之后,两者都设置为true,因此不会改变坐标。