2013-06-13 31 views
0

我有一个叫做DrawRectangles的类,它接受一个整数数组。如何使用Java中的循环将多个面板添加到JFrame?

我想要做的是通过数组中的数字和每一个,使用数组中的数字作为面板的宽度和X位置创建一个新面板。

比方说,我通过了[2,4,6,8]。我想创建一个新面板,将其添加到JFrame中,每个数字都是这样。

所以第一个面板应该从位置2开始,宽度为2.我也有一个随机颜色生成器,它应该为每个面板创建一个新的颜色。以下是我有:

public class DrawRectangles { 
    JFrame frame; 
    DrawPanel panel; 
    Random randomGenerator = new Random(); 
    int red = randomGenerator.nextInt(255); 
    int green = randomGenerator.nextInt(255); 
    int blue = randomGenerator.nextInt(255); 
    Color randomColor; 
    int[] newWidth; 

    DrawRectangles(int[] width){ 
     this.newWidth = width; 
    } 

    public void setUpFrame(){ 
     frame = new JFrame(); 
     frame.setSize(500,100); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     for(int x = 0; x < newWidth.length; x++){ 
      panel = new DrawPanel(newWidth[x]); 
      frame.add(panel); 
     } 
    } 
    class DrawPanel extends JPanel{ 
     int newWidth; 
     DrawPanel(int width){ 
      this.newWidth = width; 
      System.out.println(newWidth); 
     } 
     public void paint(Graphics g) { 
      super.paint(g); 
      randomColor = new Color(red,green,blue); 
      g.setColor(randomColor); 
      g.fillRect(newWidth, 10, newWidth, 30); 
     } 
    } 
} 
+1

1-帧有一个默认布局('BorderLayout'),它只允许一个组件存在于它的5个预配置位置。 2-你的'DrawPanel'不提供任何类型的大小提示给布局管理器,这意味着(除非他们忽略它),组件的大小将被设置为0x0。 3-你应该重载'paintComponent'而不是'paint' – MadProgrammer

回答

3

你有一些问题...

  • 机架采用BorderLayout默认。这将仅允许单个组件占据可用的预定位置中的任何一个。这意味着只有最后一个窗格才可见。
  • 您不控制油漆过程。这意味着每次randomColor更改值时,所有引用它的组件 也将在下一次绘制周期中重新绘制。
  • 您应该使用的paintComponent代替paint

这是使用单一DrawRectangle组件油漆全部矩形一个基本的例子。

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawRectangles { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       DrawRectangles dr = new DrawRectangles(new int[]{2, 4, 6, 8}); 
       dr.setUpFrame(); 

      } 
     }); 
    } 

    JFrame frame; 
    DrawPanel panel; 
    Random randomGenerator = new Random(); 
    int[] newWidth; 

    DrawRectangles(int[] width) { 
     this.newWidth = width; 
    } 

    public void setUpFrame() { 
     frame = new JFrame(); 
     frame.setSize(500, 100); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     DrawPanel panel = new DrawPanel(); 
     for (int x = 0; x < newWidth.length; x++) { 
      int red = randomGenerator.nextInt(255); 
      int green = randomGenerator.nextInt(255); 
      int blue = randomGenerator.nextInt(255); 
      panel.addRectangle(new Color(red, green, blue), newWidth[x]); 
     } 
     frame.setSize(200, 200); 
     frame.add(panel); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public class MyRectangle { 

     private Color color; 
     private Rectangle rectangle; 

     public MyRectangle(Color color, int width) { 
      this.color = color; 
      rectangle = new Rectangle(width, 10, width, 30); 
     } 

     public Color getColor() { 
      return color; 
     } 

     public Rectangle getRectangle() { 
      return rectangle; 
     } 

     public void draw(Graphics2D g2d) { 
      g2d.setColor(color); 
      g2d.fill(rectangle); 
     } 
    } 

    public class DrawPanel extends JPanel { 

     private List<MyRectangle> rectangles; 

     public DrawPanel() { 
      rectangles = new ArrayList<>(); 
     } 

     public void addRectangle(Color color, int width) { 
      rectangles.add(new MyRectangle(color, width)); 
     } 

     public void paint(Graphics g) { 
      super.paint(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (MyRectangle rect : rectangles) { 
       rect.draw(g2d); 
      } 
      g2d.dispose(); 
     } 
    } 
} 

你可以使用不同的布局管理器,但随后你DrawRectangle组件也必须返回一个preferredSize,这样的布局管理器不布局了组件的尺寸为0x0