JAVA-从不同的类中随机获取
嘿,我有一个在随机位置生成随机形状的应用程序,现在我正试图将代码划分为负责某些事情的类。但当我删掉负责“随机化”的部分代码并将其移动到另一个类时,它就不再工作了(不是随机化)。有什么想法吗?我的代码如下: 主类JAVA-从不同的类中随机获取,java,random,jframe,jpanel,draw,Java,Random,Jframe,Jpanel,Draw,嘿,我有一个在随机位置生成随机形状的应用程序,现在我正试图将代码划分为负责某些事情的类。但当我删掉负责“随机化”的部分代码并将其移动到另一个类时,它就不再工作了(不是随机化)。有什么想法吗?我的代码如下: 主类 import java.awt.BorderLayout; public class Main extends JFrame { public Main() { setLayout(new BorderLayout()); add(new Te
import java.awt.BorderLayout;
public class Main extends JFrame {
public Main() {
setLayout(new BorderLayout());
add(new TestPanel(), BorderLayout.CENTER);
}
public static void main(String[] args) {
new TestPanel();
Main frame = new Main();
frame.setSize(1000, 700);
frame.setTitle("Random things");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//frame.setResizable(false);
}
}
测试面板类
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestPanel extends JPanel {
Randoms randomized = new Randoms();
int howManyGeometrics = randomized.random1.nextInt(5-1) + 1;
int whichGeometrics = randomized.random1.nextInt(3);
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < howManyGeometrics; i++) {
draw(g);
}
}
public void draw(Graphics g) {
if(whichGeometrics==0){
//oval
g.setColor(randomized.randomColour2);
g.fillOval(randomized.x1, randomized.x2, randomized.x4, randomized.x3);
//triangle
g.setColor(randomized.randomColour3);
int xpoints[] = {randomized.x1+10, randomized.x2+15, randomized.x3+20};
int ypoints[] = {randomized.x4-20, randomized.x3-15, randomized.x2-20};
int npoints = 3;
g.fillPolygon(xpoints, ypoints, npoints);
//hourglass
g.setColor(randomized.randomColour4);
int a1=50+randomized.x1;
int a2=200+randomized.x2;
int a3=a1;
int a4=a2;
int b1=a1;
int b2=a2/2;
int b3=a2/2;
int b4=a1;
int x1points[] = {a1, a2, a3, a4};
int y1points[] = {b1, b2, b3, b4};
int ntpoints = 4;
g.fillPolygon(x1points, y1points, ntpoints);
}
else if(whichGeometrics==1){
//rectangle
g.setColor(randomized.randomColour1);
g.fillRect(randomized.x2, randomized.x3, randomized.x1, randomized.x4/2);
//triangle
g.setColor(randomized.randomColour3);
int xpoints[] = {randomized.x1+10, randomized.x2+15, randomized.x3+20};
int ypoints[] = {randomized.x4-20, randomized.x3-15, randomized.x2-20};
int npoints = 3;
g.fillPolygon(xpoints, ypoints, npoints);
//hourglass
g.setColor(randomized.randomColour4);
int a1=50+randomized.x1;
int a2=200+randomized.x2;
int a3=a1;
int a4=a2;
int b1=a1;
int b2=a2/2;
int b3=a2/2;
int b4=a1;
int x1points[] = {a1, a2, a3, a4};
int y1points[] = {b1, b2, b3, b4};
int ntpoints = 4;
g.fillPolygon(x1points, y1points, ntpoints);
}
else if(whichGeometrics==2){
//rectangle
g.setColor(randomized.randomColour1);
g.fillRect(randomized.x2, randomized.x3, randomized.x1, randomized.x4/2);
//oval
g.setColor(randomized.randomColour2);
g.fillOval(randomized.x1, randomized.x2, randomized.x4, randomized.x3);
//hourglass
g.setColor(randomized.randomColour4);
int a1=50+randomized.x1;
int a2=200+randomized.x2;
int a3=a1;
int a4=a2;
int b1=a1;
int b2=a2/2;
int b3=a2/2;
int b4=a1;
int x1points[] = {a1, a2, a3, a4};
int y1points[] = {b1, b2, b3, b4};
int ntpoints = 4;
g.fillPolygon(x1points, y1points, ntpoints);
}
else if(whichGeometrics==3){
//rectangle
g.setColor(randomized.randomColour1);
g.fillRect(randomized.x2, randomized.x3, randomized.x1, randomized.x4/2);
//oval
g.setColor(randomized.randomColour2);
g.fillOval(randomized.x1, randomized.x2, randomized.x4, randomized.x3);
//triangle
g.setColor(randomized.randomColour3);
int xpoints[] = {randomized.x1+10, randomized.x2+15, randomized.x3+20};
int ypoints[] = {randomized.x4-20, randomized.x3-15, randomized.x2-20};
int npoints = 3;
g.fillPolygon(xpoints, ypoints, npoints);
}
}
}
我将非常感谢您的帮助或/和建议:)每次需要新的随机数时,您都应该使用Math.random()。您创建了一个
Randoms
的实例,然后继续使用其成员x1
等,而不更改其值
我怀疑您的旧工作代码创建了多个Randoms
实例
一个简单的解决方案是将
reRandomize()
方法添加到Randoms
,该方法将每个成员设置为一个新的随机值,并在每个形状之前调用该值。正如John3136中已经指出的,主要问题是您总是使用相同的Randoms
实例。但不可否认,这个Randoms
类本身在其当前形式下似乎有问题。随机值存储为字段,隐式导致原始问题。我可以想象这样一个Randoms
类如果包含适当的方法可能会更有用。例如,像
class Randoms
{
private static final Random random =
new Random(System.currentTimeMillis());
public static Color createRandomColor()
{
int red = random.nextInt(255);
int green = random.nextInt(255);
int blue = random.nextInt(255);
return new Color(red,green,blue);
}
public static int nextInt(int min, int max)
{
return random.nextInt(max - min) + min;
}
}
除此之外,“沙漏”的代码总是一样的。在这种情况下,您应该考虑创建一个类似的方法。
private void paintHourglass(Graphics g, int x0, int x1) {
// Here the repeated code...
}
也许你应该更清楚地描述你想要实现的目标。如果您只想生成一组随机形状,则可以创建它们并将其存储在列表中:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RandomsTest extends JFrame {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new TestPanel());
frame.setSize(1000, 700);
frame.setTitle("Random things");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//frame.setResizable(false);
}
}
class TestPanel extends JPanel
{
private List<Geometry> geometries;
TestPanel()
{
geometries = new ArrayList<Geometry>();
int numGeometries = Randoms.nextInt(5, 8);
for (int i=0; i<numGeometries; i++)
{
geometries.add(new Geometry());
}
}
public void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
for (Geometry geometry : geometries)
{
geometry.draw(g);
}
}
}
class Geometry
{
private final Color color;
private final Shape shape;
Geometry()
{
this.color = Randoms.createRandomColor();
this.shape = Shapes.createRandomShape();
}
void draw(Graphics2D g)
{
g.setColor(color);
g.fill(shape);
}
}
class Shapes
{
static Shape createRandomShape()
{
int type = Randoms.nextInt(2);
switch (type)
{
case 0 : return createRandomOval();
case 1 : return createRandomRectangle();
}
return createRandomOval();
}
private static Shape createRandomOval()
{
return new Ellipse2D.Double(
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800));
}
private static Shape createRandomRectangle()
{
return new Rectangle2D.Double(
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800));
}
}
class Randoms
{
private static final Random random =
new Random(System.currentTimeMillis());
public static Color createRandomColor()
{
int red = random.nextInt(255);
int green = random.nextInt(255);
int blue = random.nextInt(255);
return new Color(red,green,blue);
}
public static int nextInt(int min, int max)
{
return random.nextInt(max - min) + min;
}
public static int nextInt(int max)
{
return random.nextInt(max);
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.geom.Ellipse2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类RandomsTest扩展JFrame{
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.getContentPane().add(新的TestPanel());
框架设置尺寸(1000700);
frame.setTitle(“随机事件”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
//frame.setresizeable(false);
}
}
类TestPanel扩展了JPanel
{
私有列表几何图形;
测试面板()
{
几何图形=新的ArrayList();
int numGeometries=Randoms.nextInt(5,8);
对于(int i=0;i首先,您如何知道它不是随机的?其次,int red=random1.nextInt(255)
将生成0到254之间的值。您需要intred=random1.nextInt(256)
。不,我只有一个随机实例。一般来说,我建议不要使用Math.Random()。Math.Random()的问题调试很难:您永远无法获得相同的随机数序列。使用java.util.random
可以通过创建新随机数(种子)轻松实现这一点
具有固定种子值的实例。此外,java.util.Random
包含一些常规方法,如nextInt
,在使用Math.Random()时必须自己实现这些方法@Marco13如果永远无法获得相同的随机数序列,那么它是随机的。否则它将是伪随机的。java.util.random或Math.random返回的所有数字都是伪随机的。关键点是,在第一种情况下,您可以定义随机种子(从而始终获得相同的数字序列),在后期,您不能。我只想在每次重新启动应用程序时获得随机数目的随机生成的形状。这就是示例应用程序所做的。当然,您可以在shapes
类中使用进一步的随机形状来扩展它(例如沙漏,或使用Path2D的完全随机形状)是的,谢谢你,伙计,现在我明白了,但我还需要一件事,我不知道如何做到这一点-有没有办法在调整JFrame的大小后(我是说在我开始应用程序后)再生成一个随机几何体?更清楚地描述你的意思。是否每次调整框架大小或重新绘制框架时几何图形都会改变?如果有疑问,只需将测试面板中几何图形的创建从构造函数移动到paintComponent中……从PaintPanel的构造函数中获取代码,并将此代码放入paintCompone中nt方法。这是非常丑陋的,没有意义,但如果你想要它,你可以做。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RandomsTest extends JFrame {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new TestPanel());
frame.setSize(1000, 700);
frame.setTitle("Random things");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//frame.setResizable(false);
}
}
class TestPanel extends JPanel
{
private List<Geometry> geometries;
TestPanel()
{
geometries = new ArrayList<Geometry>();
int numGeometries = Randoms.nextInt(5, 8);
for (int i=0; i<numGeometries; i++)
{
geometries.add(new Geometry());
}
}
public void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
for (Geometry geometry : geometries)
{
geometry.draw(g);
}
}
}
class Geometry
{
private final Color color;
private final Shape shape;
Geometry()
{
this.color = Randoms.createRandomColor();
this.shape = Shapes.createRandomShape();
}
void draw(Graphics2D g)
{
g.setColor(color);
g.fill(shape);
}
}
class Shapes
{
static Shape createRandomShape()
{
int type = Randoms.nextInt(2);
switch (type)
{
case 0 : return createRandomOval();
case 1 : return createRandomRectangle();
}
return createRandomOval();
}
private static Shape createRandomOval()
{
return new Ellipse2D.Double(
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800));
}
private static Shape createRandomRectangle()
{
return new Rectangle2D.Double(
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800),
Randoms.nextInt(800));
}
}
class Randoms
{
private static final Random random =
new Random(System.currentTimeMillis());
public static Color createRandomColor()
{
int red = random.nextInt(255);
int green = random.nextInt(255);
int blue = random.nextInt(255);
return new Color(red,green,blue);
}
public static int nextInt(int min, int max)
{
return random.nextInt(max - min) + min;
}
public static int nextInt(int max)
{
return random.nextInt(max);
}
}