gpt4 book ai didi

java - 在 Java 中绘制和移动圆

转载 作者:行者123 更新时间:2023-12-03 20:20:23 24 4
gpt4 key购买 nike

我正在使用 Swing 在 Java 中创建一个小型 GUI。我想让它做的就是获取 CircleArrayList 并绘制它们。我遇到了两个问题:

1) 在绘制圆之前,我必须重复调用我的 draw 方法。如果我只是在没有任何反应时调用我的 draw 方法,我会得到一张空白图。如果我在运行时间少于 30 毫秒的循环中调用它,它只会绘制我想要绘制的两个圆圈中的第一个。最后,如果我调用它的时间超过 30 毫秒,它会绘制我尝试绘制的两个圆圈。

2) 当我移动其中一个圆圈时,绘图上出现“闪烁”。

我不太熟悉 Swing 编程。我查看了示例代码并观看了一些视频 - 我所拥有的看起来很适合我。但我想我一定是搞砸了,因为在我看过的视频中看起来不是这个样子。

这是我的 GUI 类:

package gui;

import draw.*;
import java.util.List;
import javax.swing.*;

public class GUI extends JFrame {
private CirclePainter drawingBoard = new CirclePainter();

public GUI()
{
setSize(500, 500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
this.add(drawingBoard);
drawingBoard.setVisible(true);
}

public void draw(List<Circle> circles)
{
drawingBoard.paintComponent(drawingBoard.getGraphics(), circles);
}
}

我的 CirclePainter

package gui;

import draw.Circle;

import javax.swing.*;
import java.awt.*;
import java.util.List;

class CirclePainter extends JPanel
{
public void paintComponent(Graphics graphics, List<Circle> circles)
{
super.paintComponent(graphics);
for(Circle circle : circles)
graphics.fillOval(circle.getX(), circle.getY(), circle.getRadius() * 2, circle.getRadius() * 2);
}
}

编辑:编辑了一些代码,因为这是一个学校项目。剩下的代码应该足以让将来访问的人仍然理解这个问题。

最佳答案

  1. 切勿直接调用paintComponent(...)
  2. 而是在必要时通过在组件上调用 repaint() 建议绘制。
  3. 不要使用通过组件上的 getGraphics() 调用获得的 Graphics 对象进行绘制。相反,使用 paintComponent 方法中提供的 Graphics 对象进行绘制。
  4. 避免在 Swing GUI 中使用 while (true) 循环,因为您可能会占用 Swing 事件线程并卡住 GUI。使用 Swing Timer 制作简单的动画。
  5. 您可能甚至不需要 Swing Timer,因为您的动画可以由 MouseListener/MouseMotionListener 驱动。
  6. 重要 -- 请阅读 Swing 绘画和其他教程,因为大部分信息都可以在那里找到。看起来您正在猜测如何进行某些编码,而在绘制或动画化 GUI 时,这是一件危险的事情。您可以在 Swing info 中找到大部分教程。链接。
  7. 考虑使用 Shape 对象来表示您的 Circle,例如 ellipse2D。这会有所帮助的原因是它有一些非常有用的方法,包括一个 contains(Point p) 方法,可以帮助您确定鼠标点击是否落在您的圆圈内。
  8. 您需要决定 _x 和 _y 是否代表圆的中心点。如果是这样,那么您需要调整您的绘图,将它向左和向上移动 _radius 量。
  9. 考虑将您的 Graphics 对象转换为 Graphics2D 对象,以便使用其额外的方法和属性。
  10. 其中一个属性是 RenderingHings。设置您的 Graphics2D RenderingHints 以允许抗锯齿消除图像“锯齿”。这可以通过以下方式完成:g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    其中 g2 是您的 Graphics2D 对象。
  11. 您的 paintComponent 方法不是真正的 paintComponent 覆盖,因此无法正常工作。它应该是一个 protected 方法,而不是 public,它应该有一个参数,一个 Graphics 对象,和第二个参数,你应该将 @Override 注释放在它上面。

例如,请看this answer我的一个类似的问题。

以 _x 和 _y 为中心并使用渲染提示的 paintComponent 方法示例:

class CirclePainter extends JPanel implements Iterable<Circle> {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
private CircleList circleList = new CircleList();

@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g2 = (Graphics2D) graphics;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (Circle circle : circleList) {
// if x and y are the center points, then you must subtract the radius.
int x = circle.getX() - circle.getRadius();
int y = circle.getY() - circle.getRadius();
int width = circle.getRadius() * 2;
int height = width;
g2.fillOval(x, y, width, height);
}
}

关于java - 在 Java 中绘制和移动圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27071128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com