2011-04-05 46 views
1

我需要创建一个程序,在JFrame或JPanel上显示多个矩形。这是我到目前为止的代码:JPanel/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); 
} 

} 

什么,我要做的是:编写显示在随机位置的一些长方形的计划。供应按钮“更少”和“更多”可生成更少或更多的随机矩形。每次用户点击“较少”时,计数应该减半。每次用户点击“更多”时,计数应该加倍。

+0

你的具体问题是什么? – jzd 2011-04-05 18:16:13

+0

我需要知道如何显示多个矩形的框架或面板 – carlly 2011-04-05 18:18:24

+2

小的一点,但这是一个需求的声明,而不是一个问题。问题以问号(?)结尾。 – 2011-04-05 18:28:30

回答

3

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

如果您只想显示矩形,则不需要创建RectangleComponent - 您可以重写JFrame的paint super.paint,并放置并绘制矩形。在这种情况下,您必须在所有ActionListeners的jframe中添加repaint()。

编辑:更好的主意是添加一个JPanel,只此面板上绘制矩形,否则矩形将超过按钮,将“消失”按钮点击后,看看这个simple demo

+1

感谢您纠正您的帖子(1+)。直接在JFrame上绘图还有其他问题,包括丢失双缓冲。绘制JPanel或JComponent几乎总是更好。 – 2011-04-05 21:31:54

1

我想给我的RectangleComponent类Rectangle的ArrayList,称为rectangleList。我会给这个类两个public void方法,addRectangle()和removeRectangle()。在addRectangle()方法中,我会创建一个随机Rectangle(大小适合RectangleComponent的Dimensions),将它添加到ArrayList并调用repaint。在removeRectangle中,如果数组列表的大小大于0,我会删除一个Rectangle,然后再次调用repaint。在paintComponent中,我会遍历ArrayList,绘制矩形。我也有paintComponent在方法开始时调用super方法。

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