Java 我的绘画方法部分有效。循环中的“绘制”命令不会执行。我怎样才能解决这个问题?

Java 我的绘画方法部分有效。循环中的“绘制”命令不会执行。我怎样才能解决这个问题?,java,jframe,jpanel,paintcomponent,cellular-automata,Java,Jframe,Jpanel,Paintcomponent,Cellular Automata,我的绘画方法的一部分工作,例如拉丝,工作得非常好,但绘画方法的所有其他部分都没有按照我希望的方式工作。我想制作一个类似于Wolfram细胞自动机的细胞自动机。我主要是从其他具有有效绘制方法的项目中复制了我的绘制方法,因此我不知道该方法本身在做什么。您的整个方法都失败了,我建议您遵循以下准则: 首先也是最重要的是在JPanel的paintComponent方法中绘制,并确保在方法重写中调用相同的超级方法。这在Swing绘图教程中有很好的描述:。 如果您的目标是设置单元格显示变化的动画,那么whil

我的绘画方法的一部分工作,例如拉丝,工作得非常好,但绘画方法的所有其他部分都没有按照我希望的方式工作。我想制作一个类似于Wolfram细胞自动机的细胞自动机。我主要是从其他具有有效绘制方法的项目中复制了我的绘制方法,因此我不知道该方法本身在做什么。

您的整个方法都失败了,我建议您遵循以下准则:

首先也是最重要的是在JPanel的paintComponent方法中绘制,并确保在方法重写中调用相同的超级方法。这在Swing绘图教程中有很好的描述:。 如果您的目标是设置单元格显示变化的动画,那么while循环不属于绘画方法,事实上,我敢说您的代码不应该有while循环 相反,请使用a来帮助您驱动动画。您可以在计时器的ActionListener中调用下一代,然后调用repaint,这将向JPanel发出重新绘制自身的信号。 在paintComponent方法中,使用元胞自动机数据的状态来帮助决定要绘制的内容和位置。 此外:

决不要直接在JFrame中绘制,因为这是一个复杂的顶级窗口容器,直接在JFrame中绘制可能会破坏其显示所包含组件的能力 不要在绘制方法替代中调用super.paintComponents。在这种情况下,超级调用应该与覆盖调用匹配。 同样,您甚至不应该重写paint,而应该重写JPanel的paintComponent方法。 您似乎正在用面板JPanel覆盖JFrame 您的类扩展了JFrame,这是您几乎不想做的事情。
无论您从何处复制此代码,都要丢弃它,因为您的代码在许多级别上都是错误的。你直接在JFrame中画画,这是你永远不应该做的,你用画法画画,这是你不应该做的,你调用了错误的超级方法,。。。。我可以继续。为什么不读一下如何画画的源代码,Swing绘画教程。此外,看起来while loop不属于一个绘画方法,因为您似乎正在尝试为不同代的自动机绘制动画,并且只会看到最后一代。取而代之的是,在计时器中调用repaint来更改自动机数据的状态,然后使用自动机状态来告诉您的绘图JPanel的paintComponent方法要绘制什么以及如何绘制。多谢各位
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Arrays;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class CA extends JFrame
{
    static int[] cells = new int[60];
    static int generation;

    static int[] ruleSet = {0,0,0,0,0,0,0,1};

    int width = 600;
    int w = 15;

    JFrame frame;
    JPanel panel;

    public CA() 
    {
        generation = 0;
        panel = new JPanel();
        this.setSize(1000, 1000);
        this.setVisible(true);
        panel.setLayout(null);
        this.add(panel);
        repaint();
    }

    public static void generate() 
    {
        int[] nextGen = new int[cells.length];
        for(int i = 1; i < cells.length-1; i++) 
        {
            int left = i-1;
            int me = i;
            int right = i+1;
            nextGen[i] = rules(left,me,right);
        }
        for(int i = 0; i < nextGen.length; i++) 
        {
            cells[i] = nextGen[i];
        }
        System.out.println(Arrays.toString(cells));
    }

    public static int rules(int a, int b, int c) 
    {
        if(a == 1 && b ==1 && c == 1)
            return ruleSet[0];
        else if(a == 1 && b ==1 && c == 0)
            return ruleSet[1];
        else if(a == 1 && b ==0 && c == 1)
            return ruleSet[2];
        else if(a == 1 && b ==0 && c == 0)
            return ruleSet[3];
        else if(a == 0 && b ==1 && c == 1)
            return ruleSet[4];
        else if(a == 0 && b ==1 && c == 0)
            return ruleSet[5];
        else if(a == 0 && b ==0 && c == 1)
            return ruleSet[6];
        else
            return ruleSet[7];
    }
    public static void main(String[] args) 
    {
        for(int i = 0 ; i < cells.length; i++) 
        {
            cells[i]=0;
        }
        int num = (int)cells.length / 2;
        cells[num] = 1;
        new CA();
    }

    public void paint(Graphics g) 
    {
        super.paintComponents(g);
        //g2d.drawRect(10, 10, 100, 100);
        //generation = 0;
        System.out.println("generation ......." + generation);
        while(generation < 3) 
        {
            int counter = 0;
            System.out.println("cells...." + Arrays.toString(cells));
            for( int i : cells) 
            {
                if(i == 1) 
                {
                    System.out.println("i == 1");
                    g.fillRect((counter*w) + 300, generation + 300, w, w);
                    //counter++;
                }
                else {
                    System.out.println("not filling rect");
                }
            }
            System.out.println("generation ...in while ...." + generation);
            generate();
            generation++;
        }
        g.drawString("this works", 100, 100);
    }
}