在`repaint()`之后,JFrame中心的绘图圆不会更新

时间:2015-11-13 19:38:37

标签: java swing jframe point

我正在编写一个程序,它涉及使用Graphics类中的drawOval()创建一个JFrame并在其中绘制一个圆圈。我遇到了一个问题,我试图在JFrame的中心创建一个点,然后绘制我的圆圈,这个圆圈是x和y坐标。到目前为止,这是我的代码:

import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.Point;

class MouseJFrameMotion  extends JFrame implements MouseMotionListener{

    int circleXcenter;
    int circleYcenter;  
    int circleRadius = 50;
    boolean show = false;

    public MouseJFrameMotion(){       
        addMouseMotionListener(this);
    }

    public void paint(Graphics g){     

        super.paint(g);

        if(show){
            g.drawOval(circleXcenter,circleYcenter, circleRadius*2,circleRadius*2);
        }
    }

    public void mouseDragged(MouseEvent e){

    }

    Point frameCenter = new Point((this.getWidth()/2), (this.getHeight()/2));

    public void mouseMoved(MouseEvent e){
        int xLocation = e.getX();
        int yLocation = e.getY();   
        show = true;
        circleXcenter = (int) frameCenter.getX();
        circleYcenter = (int) frameCenter.getY();
        repaint();
    }
}

public class GrowingCircle {

    public static void main(String[] args) {
        MouseJFrameMotion  myMouseJFrame = new MouseJFrameMotion();
        myMouseJFrame.setSize(500, 500);
        myMouseJFrame.setVisible(true);
    }
}

正如您在main()函数中看到的,我将JFrame的大小设置为500x500。但是,当绘制圆时,在调用Point frameCenter后基于repaint()的期望它们为(250,250)时,它的x和y坐标为(0,0)。我哪里错了?

3 个答案:

答案 0 :(得分:2)

所以有两件事......

  1. 请勿覆盖paint的{​​{1}},JFrameJRootPane以及用户与框架表面之间的其他组件,这些组件可能会干扰绘画。相反,请使用contentPane并覆盖其JPanel方法
  2. 在评估paintComponent时,框架的大小为Point frameCenter = new Point((this.getWidth()/2), (this.getHeight()/2));,您需要在绘制圆圈之前重新评估0x0。执行此操作时,将取决于您希望更改的动态程度

答案 1 :(得分:0)

我认为你需要repaint()和revalidate()方法

答案 2 :(得分:0)

在构建MouseJFrameMotion类时,定义了变量frameCenter并设置了width和height 0,它永远不会改变。因此,您可以做的是在绘图时计算框架中心。

public void mouseMoved(MouseEvent e) {
    int xLocation = e.getX();
    int yLocation = e.getY();
    show = true;
    Point frameCenter = new Point((this.getWidth() / 2), (this.getHeight() / 2));
    circleXcenter = (int) frameCenter.getX();
    circleYcenter = (int) frameCenter.getY();
    repaint();
}