Java更新和刷新JPanel上的BufferedImage

时间:2018-11-07 11:09:13

标签: java

这里很新。尝试学习Java。

我认为我会编写一个非常简单的“人生游戏”自动算法,以了解我是否可以掌握一些基本知识-(语法和概念与其他语言等相当简单)。

我已经设法弄清楚了,似乎正在“掌握要诀”,但是现在我到达了一个陡峭的山坡。

此处描述的代码将编译并可执行,但是您将看到,尽管@Override到DrawComponent和repaint()调用,但屏幕上显示的实际图像似乎并没有改变...

直接问题是: 如何确保每个“循环”都更新显示?

绒毛和样品来源: 我赞赏过程式和非分布式//单一的刚性封装类,这不是Java的理想方法,也不是这种“生活游戏”特别适合该语言使用-但我希望先集中精力获取核心元素并先了解我“推进”其他事情。其次,我也意识到这不是一个非常有效的解决方案,但是我再次想通过尝试一些简单易懂的方法来学习,这样我就可以轻松地查看正在发生的事情并确保其按预期运行。 第三,我的命名或格式约定可能不正常或不标准,对此我深表歉意,并再次感谢您有一些首选的方法。这对我目前学习语言的工作方式来说不一定是优先事项。

我欢迎任何建议和技巧,但请考虑我是Java的新手,所以可能不熟悉概念和术语等。


/*                                  
Project.java                                    
By: PJ Chowdhury                                    

Entire program encapsulated in single class                                 

Created 29-Oct-2018                                 
Updated: 07-Nov-2018                                    
    Added graphics library                              
*/                                  

//Import the basic required graphics classes.                                   
import java.awt.image.BufferedImage;                                    
import java.awt.*;                                  

//Import the basic applet classes.                                  
import javax.swing.*;                                   


//Core class                                    
public class project                                    
    {                               
        //Control value - determines when overpopualted or extinct                          
        private static int supercount;                          

        //Control value - how many surrounding cells must be alive for the central cell to survive                          
        private static byte thrive=4;                           

        //Define & declare effective constant size values                           
        private static byte size=64;                            
        private static byte cellsize=4;                         

        //Declare effective singleton arrays of cells                           
        private static boolean[][] cells;                           
        private static boolean[][] prolif;                          

        //Declare Window Frame                          
        public static JFrame frame;                         

        //Declare Graphics                          
        public static JPanel panel;                         

        //main entry-point. Execution must include parameter argument.                          
        public static void main(String[] args)                          
            {                       
                initialise();                   
                do                  
                    {               
                        runtime();          
                        defaultcells();         
                    }               
                while (1>0); //Bad form of course. I wanted an infinite loop. The window can be closed at user request.                 
            }                       

        //Initialises window & graphics frame                           
        public static void initialiseframe()                            
            {                       
                //Create Window                 
                frame = new JFrame("Life Cells");                   

                //Define window parameters                  
                frame.setSize((int)cellsize*size,(int)cellsize*size);                   
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                   
                frame.setVisible(true);                 

                //Create a window panel to accept graphics                  
                panel = new JPanel()                    
                    {               
                        //Overload PaintComponent method to redraw image when the frame panel is redrawn            
                        @Override           
                        public void paintComponent(Graphics g)          
                            {       
                                super.paintComponent(g);    
                            }       
                        };                  

                //attach this panel as a gadget to the frame window                 
                    frame.add(panel);                       

                //frame.pack();// Deprecated as this resizes frame window to a minimal size                 

                frame.validate(); // required since panel was added after setVisible was called                 
                frame.repaint(); // required since panel was added after setVisible was called                  
            }                       

        //Initialises & defaults cells                          
        public static void initialisecells()                            
            {                       
                //Define array sizes                    
                cells = new boolean[size][size];                    
                prolif = new boolean[size][size];                   
                // Populate with defaults                   
                defaultcells();                 
            }                       

        //Sets randomised state for each cell                           
        public static void defaultcells()                           
            {                       
                byte x;                 
                byte y;                 

                for (y=0;y<size;y++)                    
                    {               

                        for (x=0;x<size;x++)            
                            {       
                                if (Math.random()>=0.5) 
                                    {

                                    }
                                else    
                                    {

                                    }
                            }       
                    }               
            }                       

        //Wraps initialisation routines                         
        public static void initialise()                         
            {                       
                initialiseframe();                  
                initialisecells();                  
            }                       

        //iterates cells (twice) to determine if they survive or decline and draw to image                          
        public static void process()                            
            {                       
                //Prepare image for cell drawing                    
                Graphics g=panel.getGraphics();                 

                byte x;                 
                byte y;                 

                supercount=0;                   

                //First pass - check if cell will thrive                    
                for (y=0;y<size;y++)                    
                    {               

                        for (x=0;x<size;x++)            
                            {       
                                checkcell(x,y); 
                            }       
                    }               


                //Second pass - apply thrive or wither                  
                for (y=0;y<size;y++)                    
                    {               

                        for (x=0;x<size;x++)            
                            {       
                                if (updatecell(x,y))    
                                    {

                                    }
                                if (cells[x][y])    
                                    {

                                    }
                            }       
                    }               
            }                       

        //sets prolif equivalent depending on status of surrounding cells. This is used in update to set these cells to thrive                          
        public static void checkcell(byte x, byte y)                            
            {                       
                byte count=getsurrounding((int)x,(int)y);                   
                if (count>thrive)                   
                    {               
                        prolif[x][y]=true;          
                    }               
                else                    
                    {               
                        if (count<thrive)           
                            {       
                                prolif[x][y]=false; 
                            }       
                        else            
                            {       
                                prolif[x][y]=cells[x][y];   
                            }       
                    }               
            }                       

        //updates cell with prolif equivalent and returns true if cahnged                           
        public static boolean updatecell(byte x, byte y)                            
            {                       
                if (cells[x][y]!=prolif[x][y])                  
                    {               
                        cells[x][y]=prolif[x][y];           
                        return true;            
                    }               
                return false;                   
            }                       

        //returns number of thriving "cells" surrounding cell at given coords                           
        public static byte getsurrounding(int x, int y)                         
            {                       
                int u=(x-1);                    
                int v=(y-1);                    

                int ux;                 
                int vy;                 

                byte count=0;                   

                for (v=(y-1);v<(y+2);v++)                   
                    {               
                        //Use wraparound for edge cells         
                        vy=(v+size) % size;         

                        for (u=(x-1);u<(x+2);u++)           
                            {       
                                //Use wraparound for edge cells 
                                ux=(u+size) % size; 

                                //Only for surrounding cells, not this cell 
                                if ((ux!=x) & (vy!=y))  
                                    {




                                    }

                            }       
                    }               
                return count;                   
            }                       

        //Draw cell at x,y : not the most efficient nor elegant method...                           
        public static void drawcell(Graphics g, int x, int y, boolean live)                         
            {                       
                if (live)                   
                    {               
                        // Draw this cell alive         
                        //g.setColor(Color.GREEN);          
                    }               
                else                    
                    {               
                        // Draw this cell dead          
                        g.setColor(Color.BLACK);            
                    }               

                g.fillRect(x*cellsize, y*cellsize,cellsize,cellsize);                   

                panel.repaint(x*cellsize, y*cellsize,cellsize,cellsize);                    
            }                       

        //Returns true if population is healthy. False if extinct or overcrowded                            
        public static boolean populationanalysis()                          
            {                       
                        return ((supercount<thrive)||(supercount>(int)(size*size)<<1));         
            }                       

        //Main Loop method                          
        public static void runtime()                            
            {                       
                int sanity=5000;                    
                int loopcount=0;                    
                do                  
                    {               
                        process();          
                        loopcount++;            
                        if (populationanalysis())           
                            {       
                                break;  
                            }       
                    }               
                while (loopcount<sanity);                   
            }                       
    }                               

0 个答案:

没有答案