之前的程序会有严重的画面闪烁问题,现在的版本解决了这个问题。
我在B站上做的视频演示:https://b23.tv/5DBy9C
用java做动态图形界面的话,如果将图形画在jframe上,当刷新频率较高是就会出现这个问题,如果大家要解决这个问题需要将图形画在jpanel上面(jpanel底层解决了这个问题)。
1、规则为经典b2/s23规则
方块有颜色代表细胞存活,没有颜色代表细胞死亡
- 少于2个邻居的点,在下一回合死去。模拟生命较少的情况。
- 在周围邻居数量是2和3时,下一回合保持不变
- 在周围邻居数量大于3时,下一回合死去,模拟生命拥挤的情况。
- 当一个空白的点,周围的邻居数量是3个是, 下一回合将会产生一个新的点。模拟繁殖
2、实现建议鼠标缩放
3、实现rule初始坐标信息导入
4、内置3种模型 星门 高斯帕 振荡器
高斯帕滑翔机枪
星门
振荡器集合
导入功能
下面是实现的主要代码
package com.lzl.frame;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class Myjpan extends JPanel {
//初始方格长度
volatile int buchang = 10;
volatile boolean b = false;
//记录窗口大小变化后上一次的窗口大小,窗体大小变化后重新排列
volatile int w1;
volatile int h1;
//储存活细胞坐标的集合
volatile List<ZuoBiao> list = new ArrayList<ZuoBiao>();
//储存死亡的活细胞集合
volatile List<ZuoBiao> list2 = new ArrayList<ZuoBiao>();
//rule坐标信息读取后先存放在这里
volatile List<ZuoBiao> list3 = new ArrayList<ZuoBiao>();
//左右下内边距
int xx = 0;
//上边距
int yy = 0;
//数组大小与方格数相同 记录细胞状态 活为1 死为0
volatile int[][] a;
//每过多少毫秒演化一次
volatile int sudu = 1000;
volatile boolean r1 = false;
volatile String rule = "";
JButton jb = new JButton();
JButton jb3 = new JButton("加快");
JButton jb2 = new JButton("自动");
JButton jb4 = new JButton("随机");
JButton jb5 = new JButton("初始化");
JButton jb6 = new JButton("导入");
JFrame jFrame = new JFrame();
//下拉框
JComboBox<String> jc = new JComboBox<>(new String[] { "无", "星门", "震荡循环集合", "高斯帕滑翔机" });
public Myjpan() {
jFrame.setBounds(300, 300, 600, 520);
jFrame.add(this);
w1 = jFrame.getWidth();
h1 = jFrame.getHeight();
//设置窗口关闭
jFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
};
});
jFrame.setVisible(true);
jFrame.setLayout(null);
//添加窗口监听
jFrame.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
//窗口发生该变时调用
@Override
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
//判断窗口变大变小
if (w1 < e.getComponent().getWidth() || h1 < e.getComponent().getHeight()) {
//计算出变化后的网格长宽
int whi = e.getComponent().getWidth() - xx * 2;
int hei = (e.getComponent().getHeight() - xx - yy);
//计算变化后的网格数
whi = (whi - whi % buchang) / buchang;
hei = (hei - hei % buchang) / buchang;
//简历对应新窗体大小的数组
int[][] b = new int[whi][hei];
//初始化数组
initArray(b);
for (int i = 0; i < list.size(); i++) {
//将活细胞坐标设置为适应新窗体大小的坐标,并设置该位置的状态
ZuoBiao z = list.get(i);
z.setX(z.getX() + whi / 2 - a.length);
z.setY(z.getY() + hei / 2 - a[0