所以我已经被这个问题困扰了一段时间,我迫切需要帮助。请帮我。我有 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 Painting和 Painting in AWT and Swing了解更多详情。
更深入地了解布局管理器和组件层次结构的工作原理也没有什么坏处
关于java - 绘制在 Java GUI 中创建为实例的圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46776901/