当前位置: 首页 > 知识库问答 >
问题:

在 JFrame 中心绘制圆圈在“repaint()”后不会更新

邰博远
2023-03-14

我正在编写一个程序,其中包括创建一个JFrame,并使用Graphics类中的< code>drawOval()在其中绘制一个圆。我遇到了一个问题,我试图在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。但是,当绘制圆圈时,当我期望它们在调用reine()后基于Point frameCenter时,它们的x和y坐标是(0,0)。我哪里出错了?

共有3个答案

云弘壮
2023-03-14

当您构造类 MouseJFrameMotion 时,将定义可变帧中心并将宽度和高度设置为 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();
}
习哲彦
2023-03-14

我认为你同时需要re户()和reval的()方法

郎和志
2023-03-14

所以有两件事...

  1. 不要覆盖JFrame油漆,用户和框架表面之间有一个JRootPanecontentPane和其他组件,这可能会干扰绘画。相反,请使用 JPanel 并重写其 paintComponent 方法
  2. 在计算的时间点 frameCenter = new Point((this.getWidth()/2), (this.getHeight()/2)); 被评估时,帧的大小0x0,你需要在绘制圆之前重新评估框架中心。何时执行此操作将取决于您希望更改的动态程度
 类似资料:
  • 问题内容: 我只想在鼠标单击后绘制圆圈。由于paintComponent方法调用了自身,因此首先绘制圆而无需单击。 问题答案: 您的代码存在一些问题: 你永远不会打电话 你只需要一个和 请注意,当您调整框架大小时,某些圆圈将消失,并且总体上以奇怪的方式表现。 我会将所有s 存储在用户单击的位置,然后在方法内部遍历该列表。这样您就可以通话,而圈子不会消失。 更改后的工作代码:

  • 问题内容: 如何使用HTML5和CSS3画圆? 也可以在其中放入文字吗? 问题答案: 本身不能画一个圆。但是您可以制作与圆相同的东西。 您必须创建一个带有圆角(通过border-radius)的矩形,该圆角是要制作的圆的宽度/高度的一半。

  • 我知道我可以只打印出图像,但我想找出玩家何时与不正确的颜色碰撞(就像颜色切换中的做法一样),以便他们在这种情况下失败,我假设如果我使用图片是不可能的。我该怎么做?

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非

  • 我想用javascript在响应画布上画一个圆圈。我得到了画布的宽度和高度,但由于div标签的宽度和高度%,我能够正确地画出圆圈。div标记的宽度和高度以%为单位,因为我想在单个页面上显示5个画布。是否有其他方法可以在一页上放置5块画布,并使用画布的高度和宽度在每个画布上画一个圆圈?还有一件事,我不想要绝对位置,因为根据浏览器的宽度,我想要改变画布的位置 图片:192.168。10.29/1.巴布

  • 问题内容: 在Python中,使用Matplotlib,一个带有空圆的散点图怎么可能是 密谋?我们的目标是在一些彩色磁盘周围画一个空圆圈 已经被“scatter()”绘制,以便突出显示,理想情况下没有 不得不重新画彩色圆圈。 我试过“facecolors=None”,但没用。 问题答案: From the documentation for scatter: Try the following: