2015-05-05 29 views
2

我正在尝试创建一个程序,该程序创建9个生物样本,这些生物样本从某个中间生物样本进化而来。目前,我有9个展示,虽然这些都是完全随机的。存储要在其他8中使用的初始生物样本值的最佳方法是什么?在数据结构中存储随机行值

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

import javax.swing.JPanel; 

public class BiomorphObject extends JPanel { 

Graphics2D g2d; 
Dimension size = getSize(); 
int w = size.width; 
int h = size.height; 
Random ran = new Random(); 
int x1; 
int x2; 
int y1; 
int y2; 

public BiomorphObject(Graphics g){ 

    g2d = (Graphics2D) g; 
    g2d.setColor(Color.BLUE); 
    Random ran = new Random(); 
    int x = Math.abs(ran.nextInt(100)) % w + 120; 
    int y = Math.abs(ran.nextInt(100)) % h; 
    int xMirror = x - 120; 
    g2d.drawLine(120, 85, x, y); 
    g2d.drawLine(120, 85, 120 - xMirror, y); 

    x1 = x; 
    y1 = y; 
    x2 = Math.abs(ran.nextInt(50)) % w + 120; 
    y2 = Math.abs(ran.nextInt(50)) % h; 

    paintBiomorph(g); 
} 

public void paintBiomorph(Graphics g) { 

    super.paintComponent(g); 

    for (int i = 0; i <= 10; i++) { 
     int xMirror1 = x1 - 120; 
     int xMirror2 = x2 - 120; 
     g2d.drawLine(x1, y1, x2, y2); 
     g2d.drawLine(120 - xMirror1, y1, 120 - xMirror2, y2); 
     x1 = x2; 
     y1 = y2; 
     x2 = Math.abs(ran.nextInt(100)) % w + 120; 
     y2 = Math.abs(ran.nextInt(100)) % h; 
    } 
} 

}

这是当前的GUI我有一个截图: http://i.imgur.com/I6qweT7.png

回答

2

你不应该在绘画方法使用Random()方法。您无法控制Swing什么时候会重新绘制一个组件,而您也不希望绘画随机更改。

相反,您需要在类中创建绘画方法可用于执行自定义绘画的属性。所以你应该创建一个Biomorph对象。该对象将包含绘制单个Biomorph所需的信息。它甚至应该包含一个绘制自己的方法。让我们调用这个方法paintBiomorph(Graphics)。

当你创建你可能有它创建了一个随机Biomorph一个空的构造的Biomorph对象,那么你可能有一个构造函数一个Biomporh对象作为参数,所以你可以创建基于“父”“子” Biomorphs Biomorph。

然后您可以创建一个ArrayList保存多个Biomorh对象。然后在paintComponent()方法中遍历ArrayList,并简单地调用每个Biomorph对象上的paintBoimorph(GRaphics)方法。

只有在最初创建Biomorph对象时才会使用Random()方法。比所有需要重绘的数据之后,Biomorph必须是对象本身的一部分。

编辑:

的Biomorph类可能看起来像:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

import javax.swing.JPanel; 

public class Biomorph extends JPanel 
{ 
    List<Shape> lines = new ArrayList<Shape>(); 

    //Graphics2D g2d; 
    //Dimension size = getSize(); 
    //int w = size.width; 
    //int h = size.height; 
    //Random ran = new Random(); 
    //int x1; 
    //int x2; 
    //int y1; 
    //int y2; 

    public Biomorph() 
    { 

     //g2d = (Graphics2D) g; 
     //g2d.setColor(Color.BLUE); 
     setForeground(Color.BLUE); 

     Random ran = new Random(); 
     int x = Math.abs(ran.nextInt(100)) + 120; 
     int y = Math.abs(ran.nextInt(100)); 
     int xMirror = x - 120; 
//  g2d.drawLine(120, 85, x, y); 
//  g2d.drawLine(120, 85, 120 - xMirror, y); 
     lines.add(new Line2D.Double(120, 85, x, y); 
     lines.add(new Line2D.Double(120, 85, -x, y); 

     int x1 = x; 
     int y1 = y; 
     int x2 = Math.abs(ran.nextInt(50)) + 120; 
     int y2 = Math.abs(ran.nextInt(50)); 

     for (int i = 0; i <= 10; i++) { 
      int xMirror1 = x1 - 120; 
      int xMirror2 = x2 - 120; 
      //g2d.drawLine(x1, y1, x2, y2); 
      //g2d.drawLine(120 - xMirror1, y1, 120 - xMirror2, y2); 
      lines.add(new Line2D.Double(x1, y1, x2, y2); 
      lines.add(new Line2D.Double(-x1, y1, -x2, y2); 

      x1 = x2; 
      y1 = y2; 
      x2 = Math.abs(ran.nextInt(100)) + 120; 
      y2 = Math.abs(ran.nextInt(100)); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D)g.create(); 
     g2d.setColor(getForeground()); 

     for (Shape line: lines) 
     { 
      g2d.fill(line); 
      //g2d.draw(line); 
     } 

     g2d.dispose(); 
    } 
} 
+0

我已经分居构造函数和paint方法,并试图调用构造函数中的油漆。然而,当我尝试在GUI中调用生物形体对象时,它说我需要一个匹配参数来实现图形2D,但我不想在那里调用它,并且GUI似乎不运行。我已经做出以上更改供您查看。 –

+0

我试图做的一点是您需要存储组成Biomorph的线条,以便可以绘制线条。我用这种方法快速尝试修改你的班级。然后不知怎的,你需要将孩子Biomorph与父生物形态联系起来。我不知道你是如何做到这一点的。也许你只是使用相同的X/Y值?如果是这样,那么您需要更改构造函数以传递每个Biomorph的起始x/y值。 – camickr