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之间的值。您需要int
red=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);
    }
}