Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形循环-生成图形时出现错误_Java_Loops_Random_Graphics_Awt - Fatal编程技术网

Java 图形循环-生成图形时出现错误

Java 图形循环-生成图形时出现错误,java,loops,random,graphics,awt,Java,Loops,Random,Graphics,Awt,我试图让我的代码画10个矩形,每个矩形都有一个随机的位置和大小 问题是,出于某种原因,它只绘制一个矩形,而从不绘制其他9个矩形 我正在使用Math.random import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public c

我试图让我的代码画10个矩形,每个矩形都有一个随机的位置和大小

问题是,出于某种原因,它只绘制一个矩形,而从不绘制其他9个矩形

我正在使用
Math.random

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Punto1
        extends JPanel {

    public static void main(String[] args) {
        System.out.println("Estoy en el main");
        JFrame frame = new JFrame("Soy una ventana :D");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1280, 720);
        frame.setVisible(true);
        frame.setLocation(400, 200);
        frame.setLocationRelativeTo(null);
        frame.add(new Punto1());
    }

    public Punto1() {
    }

    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        /*if(x1 != 0 && y1 != 0 && x2 != 0 && y2 !=0){
         g.drawLine(x1,y1,x2,y2);
         */
        rectangulo(g);
    }

    public void rectangulo(Graphics g) {
        for (int i = 0; i < 10; i++) {
            int x = (int) Math.random() * 1120 + 75;
            int y = (int) Math.random() * 680 + 75;
            int width = (int) Math.random() * 960 + 50;
            int height = (int) Math.random() * 960 + 50;
            g.setColor(Color.BLUE);
            g.drawRect(x, y, width, height);
        }
    }
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.geom.Line2D;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类双关语1
扩展JPanel{
公共静态void main(字符串[]args){
System.out.println(“Estoy en el main”);
JFrame=新的JFrame(“Soy una ventana:D”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧设置大小(1280720);
frame.setVisible(true);
帧设置位置(400200);
frame.setLocationRelativeTo(空);
frame.add(新Punto1());
}
公共双关语1(){
}
公共组件(图形g){
g、 setColor(Color.BLUE);
/*如果(x1!=0&&y1!=0&&x2!=0&&y2!=0){
g、 抽绳(x1、y1、x2、y2);
*/
直肠肌群(g);
}
公共空间rectangulo(图g){
对于(int i=0;i<10;i++){
int x=(int)Math.random()*1120+75;
int y=(int)Math.random()*680+75;
int width=(int)Math.random()*960+50;
int height=(int)Math.random()*960+50;
g、 setColor(Color.BLUE);
g、 drawRect(x、y、宽度、高度);
}
}
}
(int)Math.random()
将值截断为
int
,好的,但是,
random
返回一个介于
0
1
之间的值,这意味着,小于
1
的任何值都将是,
0
0
加上
75
,即
75
,因此您的代码将绘制10个矩形在同一地点

二、可能的解决办法:

一。。。 执行计算后,将计算结果转换为
int

int x = (int)(Math.random() * 1120 + 75)
这将确保在计算结果后,根据
double
基值和截断为
int
的值进行计算

两个 利用Graphics 2D API并使用支持双值的
矩形2D

double x = Math.random() * 1120 + 75;
double y = Math.random() * 680 + 75;
double width = Math.random() * 960 + 50;
double height = Math.random() * 960 + 50;
Rectangle2D rect = new Rectangle2D.Double(x, y, width, height);
((Graphics2D)g).draw(rect);
旁注。。。 另外,除非您有特殊的原因,否则应该调用
setVisible
last,这样会减少问题的发生

JFrame frame = new JFrame("Soy una ventana :D"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
frame.setSize(1280,720);
frame.add(new Punto1());
frame.setLocationRelativeTo(null);
frame.setVisible(true);
最后(不,真的;)) 由于windows在各种操作系统中的工作方式,面板不可能与窗口大小相同,事实上,在大多数情况下,面板较小

在这种情况下,您应该避免依赖幻数并使用已知值

double x = Math.random() * getWidth() + 75;
double y = Math.random() * getHeight() + 75;
double width = Math.random() * (getWidth() / 2.0) + 50;
double height = Math.random() * (getHeight() / 2.0) + 50;
Rectangle2D rect = new Rectangle2D.Double(x, y, width, height);
((Graphics2D)g).draw(rect);

这个答案应该在这里用作模板。答案应该是这样的-格式良好,考虑周全,并带有后续挂钩。Kodus!这个概念不能在这里提出吗?@RannLifshitz你可以对Meta提出建议-但我认为这很难,因为它涵盖了广泛的问题空间。也许“帮助”部分中的“如何写出一个好答案”可能会有所帮助-但是谁来阅读帮助;)非常感谢!这真的是一个解决方案,我没有正确地设定值,这些建议也非常好。