случайные прямоугольники на JPanel / JPanel - PullRequest
1 голос
/ 05 апреля 2011

Мне нужно создать программу, которая отображает несколько прямоугольников на 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);
}

}

Приведенный выше код компилируется, но есть несколько недостатков.Кнопки при нажатии ничего не делают вместо добавления объекта RectangleComponent в рамку или панель.Я также создаю отдельный класс RectangleComponent для рисования объекта прямоугольника

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);
}

}

. Я должен сделать следующее: написать программу, которая отображает количество прямоугольников в случайных положенияхПоставьте кнопки «Меньше» и «Еще», которые генерируют меньше или больше случайных прямоугольников.Каждый раз, когда пользователь нажимает «Меньше», счет должен быть уменьшен вдвое.Каждый раз, когда пользователь нажимает «Еще», счет должен удваиваться.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Ваши кнопки [more] и [lesser] только устанавливают количество прямоугольников, но не добавляют и не удаляют их.Вы должны воссоздать их как-то.

Если вы хотите отображать только прямоугольники, вам не нужно создавать RectangleComponent - вы можете переопределить рисование JFrame, вызвав super.paint, а затем разместить и нарисовать прямоугольники.В таком случае вам нужно будет добавить repaint () на jframe во все ваши ActionListeners.

РЕДАКТИРОВАТЬ: лучше всего добавить jpanel и рисовать прямоугольники только на этой панели, в противном случае прямоугольникинад кнопками и «исчезнет» после нажатия кнопки, посмотрите эту простую демонстрацию

1 голос
/ 06 апреля 2011

Я бы дал моему классу RectangleComponent ArrayList из Rectangle, скажем, называемый rectangleList.Я бы дал классу два открытых метода void: addRectangle () и removeRectangle ().В методе addRectangle () я бы создал случайный прямоугольник (размер которого соответствовал размерам элемента RectangleComponent), добавил его в ArrayList и вызвал бы repaint.В removeRectangle я бы удалил Rectangle, если размер списка массивов> 0, и снова вызвал бы repaint.В paintComponent я бы перебрал ArrayList, рисуя прямоугольники.Я также хотел бы, чтобы paintComponent вызывал метод super в начале метода.

Затем в методах actionPerformed вашей кнопки вы вызовете соответствующий метод выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...