gpt4 book ai didi

java - 重置 JFrame View 的按钮

转载 作者:行者123 更新时间:2023-11-30 03:35:17 25 4
gpt4 key购买 nike

我必须编写一个程序来生成 20 个具有随机半径长度的随机圆。如果这些圆圈中的任何一个与另一个圆圈相交,则该圆圈必须为蓝色,如果不相交,则颜色为红色。我还必须在 JFrame 上放置一个按钮。如果按下此按钮,则需要清除 JFrame,并按照相同的颜色规则生成一组新的 20 个圆圈。我对 Java Swing 非常陌生,并且真的陷入困境。除了按钮之外,我的一切都正常。我无法生成一组新的圆圈。任何帮助将不胜感激。谢谢。

import java.awt.Graphics;
import javax.swing.JPanel;
import java.util.Random;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class IntersectingCircles extends JPanel
{
private int[] xAxis = new int [20]; // array to hold x axis points
private int[] yAxis = new int [20]; // array to hold y axis points
private int[] radius = new int [20]; // array to hold radius length


public static void main (String[] args)
{
JFrame frame = new JFrame("Random Circles");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add (new IntersectingCircles());

frame.pack();
frame.setVisible(true);
}

public IntersectingCircles()
{
setPreferredSize(new Dimension(1000, 800)); // set window size

Random random = new Random();

// Create coordinates for circles
for (int i = 0; i < 20; i++)
{
xAxis[i] = random.nextInt(700) + 100;
yAxis[i] = random.nextInt(500) + 100;
radius[i] = random.nextInt(75) + 10;
}
}

public void paintComponent(Graphics g)
{
// Add button to run again
JButton btnAgain = new JButton("Run Again");
btnAgain.setBounds(850, 10, 100, 30);
add(btnAgain);
btnAgain.addActionListener(new ButtonClickListener());

// Determine if circles intersect, create circles, color circles
for (int i = 0; i < 20; i++)
{
int color = 0;

for (int h = 0; h < 20; h++)
{
if(i != h)
{
double x1 = 0, x2 = 0, y1 = 0, y2 = 0, d = 0;

x1 = (xAxis[i] + radius[i]);
y1 = (yAxis[i] + radius[i]);
x2 = (xAxis[h] + radius[h]);
y2 = (yAxis[h] + radius[h]);

d = (Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1)*(y2 - y1))));

if (d > radius[i] + radius[h] || d < (Math.abs(radius[i] - radius[h])))
{
color = 0;
}

else
{
color = 1;
break;
}
}
}

if (color == 0)
{
g.setColor(Color.RED);
g.drawOval(xAxis[i], yAxis[i], radius[i] * 2, radius[i] * 2);
}

else
{
g.setColor(Color.BLUE);
g.drawOval(xAxis[i], yAxis[i], radius[i] * 2, radius[i] * 2);
}
}
}

private class ButtonClickListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
if(action.equals("Run Again"))
{
new IntersectingCircles();
}
}
}
}

最佳答案

建议:

  • 为您的类提供一个创建随机圆圈并调用 repaint() 的方法
  • 此方法应该创建圆圈并将它们添加到 ArrayList 中。
  • 考虑使用 Ellipse2D 来表示您的圆圈,这样您就会得到 ArrayList<Ellipse2D> .
  • 在类构造函数中调用此方法。
  • 在按钮的 ActionListener 中再次调用它。
  • 切勿在 PaintComponent 方法中添加按钮或更改类的状态。此方法用于绘制圆圈并且仅绘制它们,仅此而已。您将在每次调用 PaintComponent 方法时创建按钮,因此您可能会不必要地创建许多 JButton
  • 并且不必要地减慢了对时间要求严格的绘画方法。
  • 而是在构造函数中添加按钮。
  • 请务必调用 super.paintComponent(g)在您的paintComponent方法中作为其第一次调用。这将在需要时清除旧的圆圈。
  • 同样在 PaintComponent 中,迭代圆的 ArrayList,绘制每个圆。

关于java - 重置 JFrame View 的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122391/

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