Java JPanel/JPanel上的随机矩形

Java JPanel/JPanel上的随机矩形,java,swing,graphics,Java,Swing,Graphics,我需要创建一个在JFrame或JPanel上显示多个矩形的程序。这是我到目前为止提出的代码: import javax.swing.*; import java.util.Random; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListene

我需要创建一个在JFrame或JPanel上显示多个矩形的程序。这是我到目前为止提出的代码:

import javax.swing.*;
import java.util.Random;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class RandomRectangles extends JFrame {
private static final int FRAME_HEIGHT = 300;
private static final int FRAME_WIDTH = 250;

private JButton fewer;
private JButton more;
private Random generator = new Random();
private int count;
private JPanel display;
private JPanel panel;

public RandomRectangles()
{
    count =  generator.nextInt(100);

    setSize(FRAME_WIDTH, FRAME_HEIGHT);
    this.setTitle("Random Rectangles");

    display = new JPanel(new BorderLayout());
    setLayout(new BorderLayout());
    //display = new JPanel(new GridLayout(2,2));
    JPanel buttons = new JPanel();

    fewer = new JButton("Fewer");
    more = new JButton("More");

    buttons.add(fewer);
    buttons.add(more);

    class  fewerNum implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            count = count / 2;
        }
    }

    ActionListener listener = new fewerNum();
    fewer.addActionListener(listener);

    class  moreNum implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            count = count * 2;
        }
    }

    ActionListener listener2 = new moreNum();
    more.addActionListener(listener2);

    for (int i = 0; i <= count; i++)
    {
     // display.add(new RectangleComponent());
       add(new RectangleComponent());
    }


    //add(display, BorderLayout.CENTER);
    add(buttons, BorderLayout.SOUTH);
}

}

我要做的是:编写一个程序,在任意位置显示多个矩形。提供生成更少或更多随机矩形的“更少”和“更多”按钮。每次用户单击“更少”时,计数应减半。每次用户单击“更多”时,计数应加倍。

您的[更多]和[更少]按钮只是设置矩形的数量,而不是添加或删除它们。你必须以某种方式重新创造它们

如果您只想显示矩形,则不需要创建矩形组件-您可以覆盖JFrame的paint调用super.paint,然后放置和绘制矩形。在这种情况下,您必须在所有ActionListener的jframe上添加repaint()


编辑:更好的方法是添加一个jpanel并仅在此面板上绘制矩形,否则矩形将位于按钮上方,并在单击按钮后“消失”,请查看此

您的[更多]和[更少]按钮仅设置矩形的数量,而不是添加或删除它们。你必须以某种方式重新创造它们

如果您只想显示矩形,则不需要创建矩形组件-您可以覆盖JFrame的paint调用super.paint,然后放置和绘制矩形。在这种情况下,您必须在所有ActionListener的jframe上添加repaint()


编辑:更好的方法是添加一个jpanel并仅在此面板上绘制矩形,否则矩形将位于按钮上方,并在按钮单击后“消失”,请查看此

我将为我的矩形组件类提供一个矩形的数组列表,例如称为矩形列表。我将为该类提供两个公共void方法,addRectangle()和removeContangle()。在addRectangle()方法中,我将创建一个随机矩形(大小使其适合矩形组件的尺寸),将其添加到ArrayList并调用repaint。在RemolectAngle中,如果数组列表的大小大于0,我会删除一个矩形,然后再次调用repaint。在paintComponent中,我会遍历ArrayList,绘制矩形。我还要让paintComponent在方法的开头调用super方法


然后在按钮的actionPerformed方法中,调用上面适当的方法。

我会给我的RectangleComponent类一个矩形的ArrayList,比如称为rectangleList。我将为该类提供两个公共void方法,addRectangle()和removeContangle()。在addRectangle()方法中,我将创建一个随机矩形(大小使其适合矩形组件的尺寸),将其添加到ArrayList并调用repaint。在RemolectAngle中,如果数组列表的大小大于0,我会删除一个矩形,然后再次调用repaint。在paintComponent中,我会遍历ArrayList,绘制矩形。我还要让paintComponent在方法的开头调用super方法


然后,在按钮的actionPerformed方法中,您可以调用上面相应的方法。

您的具体问题是什么?我需要知道如何在一个框架或面板的一个小点上显示多个矩形,但这是一个需求声明,而不是一个问题。一个问题以问号(?)结尾。你的具体问题是什么?我需要知道如何在一个框架或面板的小点上显示多个矩形,但这是一个需求陈述,而不是一个问题。一个问题以问号(?)结尾。感谢您更正您的帖子(1+)。直接在JFrame上绘图还存在其他问题,包括丢失双缓冲。使用JPanel或JComponent几乎总是更好的。感谢您更正您的帖子(1+)。直接在JFrame上绘图还存在其他问题,包括丢失双缓冲。使用JPanel或JComponent几乎总是更好的。
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class RectangleComponent extends JComponent{

private Random generator = new Random();
private int xLeft;
private int yTop;

public RectangleComponent()
{
    xLeft = generator.nextInt(100);
    yTop = generator.nextInt(100);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    Rectangle rec = new Rectangle(xLeft, yTop, 20, 40);
    int amount = generator.nextInt(100);
    g2.draw(rec);
}

}