java - 绘制在 Java GUI 中创建为实例的圆圈

标签 java swing user-interface jframe

所以我已经被这个问题困扰了一段时间,我迫切需要帮助。请帮我。我有 3 节课:

Circle 只是假设在 Frame 创建的框架中以随机起始位置(并定义半径)绘制一个圆。

Frame 是主类,具有 addCircle()、bounce()、start()、stop()、run()(移动圆圈)和 quit() 等方法。此类还创建添加圆圈的框架。

Interfa 目前只是一个界面框架,我可以在其中定义半径、圆数和框架大小。

无论我尝试什么,我都无法添加两个以上的圆圈(一个是彩色的,一个不是):

“递归方式”:

 private static void addCircle(int n){
    Circle[] circles = new Circle[n+10];
    if (n > 0){
      circles[circleAdd] = new Circle();
      frame.add(circles[circleAdd]);
      circleAdd = circleAdd + 1;
      addCircle(n-1);
    }
  }

正常迭代方式

  private static void addCircles(int n){
  ArrayList<Circle> circles = new ArrayList<Circle>();
  for(int i = 0; i<=n;i++){
  circles.add(new Circle());
  frame.add(circles.get(i)); 
  }
}

这就是我创建框架的方式:

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

public Class Frame{

  private static JFrame frame;
  private static int circleAdd = 0;
  private static JPanel fra;

  public static void mainFrame(){
    frame = new JFrame();
    frame.setSize(500,500);
    frame.setVisible(true);
    fra = new JPanel();
    frame.add(fra);
...
//addCircle and addCircles
...
public static void main..
  } 
}

这是我的圈子:

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

public class Circle extends JPanel{
  private Random random = new Random();

  public void paint(Graphics g){

    int randX = random.nextInt(250)+50;
    int randY = random.nextInt(250)+50;
    g.drawOval(randX,randY,50,50);
    g.setColor(Color.ORANGE);
    g.fillOval(100,100,50,50);
  }

}

最佳答案

我建议您的一般方法是错误的。您应该拥有一个能够绘制任意数量的“圆圈”的 JPanel,而不是使用 JPanel 作为元素。 Graphics2D API 能够绘制复杂的形状(包括椭圆形)。

我看到的主要问题是:

  • JFrame 默认情况下使用 BorderLayout,这只允许将单个组件放置在五个可用位置中的每个位置
  • 布局管理器依靠preferred/minimum/maximumSize提示来确定组件的大小。他们还负责决定组件的放置位置。在您当前的实现中,这意味着您可以在组件的可见范围之外进行绘制
  • 不建议重写paint,并且未能调用super.paint可能会导致许多意外且难以诊断的问题
  • 绘画可以随时发生,因此在 paint 方法中使用随机值将导致 UI 不断变化

相反,您可以定义自己的 Circle 类,它采用您想要的位置和大小,并简单地充当容器

public class Circle {
    private int x;
    private int y;
    private int radius;

    private Ellipse2D shape;

    public Circle(int x, int y, int radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;

        this.shape = new Ellipse2D.Double(x, y, radius * 2, radius * 2);
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getRadius() {
        return radius;
    }

    public Rectangle getBounds() {
        return shape.getBounds();
    }

    public void paint(Graphics2D g2d) {
        g2d.setColor(Color.ORANGE);
        g2d.fill(shape);
    }
}

这只是一个容器类,它代表生成所需结果所需的信息。它有一个说服方法,能够绘制形状本身。

然后,您需要创建这些形状的列表并将它们绘制到您的组件

public class TestPane extends JPanel {

    private List<Circle> circles = new ArrayList<>(10);
    private Dimension size;

    public TestPane() {
        Random random = new Random();
        int maxX = 0;
        int maxY = 0;
        for (int index = 0; index < 10; index++) {
            int randX = random.nextInt(250) + 50;
            int randY = random.nextInt(250) + 50;
            circles.add(new Circle(randX, randY, 25));

            maxX = Math.max(maxX, randX + 50);
            maxY = Math.max(maxY, randY + 50);
        }
        size = new Dimension(maxX, maxY);
    }

    @Override
    public Dimension getPreferredSize() {
        return size;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Circle circle : circles) {
            Graphics2D g2d = (Graphics2D) g.create();
            circle.paint(g2d);
            g2d.dispose();
        }
    }

}

您似乎缺乏理解的一件事是绘画在 Swing 中的实际工作原理。

首先查看 Performing Custom PaintingPainting in AWT and Swing了解更多详情。

更深入地了解布局管理器和组件层次结构的工作原理也没有什么坏处

关于java - 绘制在 Java GUI 中创建为实例的圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46776901/

相关文章:

android - 为什么我的 android 微调器看起来很糟糕?

java - 如何读取数组的方法?在java中

java - 使用 Hibernate ConstraintViolationException

java - 如何使 JTable 中的列对 Swing Java 不可见

java - 如何初始化取决于组件大小的图像抓取?

qt - QML,一次编码,两次部署

java - 如何在Java中导入和导出原始图像?

java - 从 URL 创建 XML 模式有效但从本地文件创建失败?

java - 当 JOptionPane.showMessageDialog 时停止全屏窗口最小化?

java - 禁用时如何阻止 JButton 变灰?