[英]Stuck on Java Swing Project: Conway's Game of Life
I have been working on this for about four hours now. 我现在已经为此工作了大约四个小时。 I have all the logic down pat, the timer works, keyboard and mouse input works, but the paintComponent method isn't called to draw the updates!
我有所有逻辑下来pat,计时器工作,键盘和鼠标输入工作,但不调用paintComponent方法来绘制更新! I am not experienced with these sort of real time applications, so it could be anything causing this not to work.
我对这些实时应用程序没有经验,所以它可能是导致这种情况无法工作的任何因素。 Any help would be appreciated!
任何帮助,将不胜感激!
gamemain.java : gamemain.java :
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
public class gamemain extends JPanel {
public static boolean paused = true;
public static JFrame gui;
public static JPanel panel;
static int[][] worldsize = new int[1000][1000];
static world playspace = new world(worldsize);
static Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Debug: timer ticked");
playspace.updateWorldState();
panel.repaint();
}
});
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Hit painter");
g.drawString("Test", 50, 50);
for(int i = 0; i < 999; i++) {
for(int j = 0; j < 999; i++) {
if(playspace.getWorldStateAt(i, j) == 1) {
g.drawRect(i, j, 1, 1);
}
}
}
}
public static class listener implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() == ' ') {
if(paused) {
timer.start();
paused = false;
System.out.println("Unpaused");
}
else {
timer.stop();
paused = true;
System.out.println("Paused");
}
}
}
@Override
public void keyPressed(KeyEvent e) {
// unused
}
@Override
public void keyReleased(KeyEvent e) {
// unused
}
}
public static class mouselistener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
int x, y;
x = e.getX();
y = e.getY();
playspace.placeCell(x, y);
}
@Override
public void mousePressed(MouseEvent e) {
// unused
}
@Override
public void mouseReleased(MouseEvent e) {
// unused
}
@Override
public void mouseEntered(MouseEvent e) {
// unused
}
@Override
public void mouseExited(MouseEvent e) {
// unused
}
}
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui = new JFrame();
gui.setTitle("Game of Life");
gui.setSize(1000, 1000);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.addKeyListener(new listener());
panel.addMouseListener(new mouselistener());
panel.setBackground(Color.WHITE);
panel.setOpaque(true);
Container pane = gui.getContentPane();
pane.add(panel);
gui.setVisible(true);
panel.requestFocus();
}
});
}
}
world.java world.java
public class world {
int[][] worldstate = new int[1000][1000];
public world(int[][] world) {
for(int i = 0; i < 1000; i++) { // make all cells dead
for(int j = 0; j < 1000; j++) {
world[i][j] = 0;
}
}
this.worldstate = world;
}
public int getWorldStateAt(int i, int j) {
return this.worldstate[i][j];
}
public void placeCell(int x, int y) {
this.worldstate[x][y] = 1;
}
public void updateWorldState() {
int n1,n2,n3,n4,n5,n6,n7,n8,total; // all possible buddies of a cell
for(int i = 1; i < 999; i++) { // go to each cell
for(int j = 1; j < 999; j++) {
n1 = this.worldstate[i-1][j];
n2 = this.worldstate[i][j-1];
n3 = this.worldstate[i-1][j-1];
n4 = this.worldstate[i+1][j];
n5 = this.worldstate[i][j+1];
n6 = this.worldstate[i+1][j+1];
n7 = this.worldstate[i+1][j-1];
n8 = this.worldstate[i-1][j+1];
total = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8; // add them up
if(total < 2 && (this.worldstate[i][j] == 1)) { // rule 1
this.worldstate[i][j] = 0;
}
if(total > 3 && (this.worldstate[i][j] == 1)) { //rule 3
this.worldstate[i][j] = 0;
}
if((total == 3) && (this.worldstate[i][j] == 0)) { //rule 4
this.worldstate[i][j] = 1;
}
}
}
}
}
paintComponent
is never been called because gamemain
is never actually added to anything capable of displaying. 从未调用
paintComponent
因为gamemain
从未实际添加到任何能够显示的东西。
Your first task would be to remove the reliance on static
您的首要任务是消除对
static
的依赖
Something perhaps more like... 也许更像是......
public class gamemain extends JPanel {
public boolean paused = true;
int[][] worldsize = new int[1000][1000];
world playspace = new world(worldsize);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Debug: timer ticked");
playspace.updateWorldState();
repaint();
}
});
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Hit painter");
g.drawString("Test", 50, 50);
for(int i = 0; i < 999; i++) {
for(int j = 0; j < 999; i++) {
if(playspace.getWorldStateAt(i, j) == 1) {
g.drawRect(i, j, 1, 1);
}
}
}
}
//...
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame gui = new JFrame();
gui.setTitle("Game of Life");
gui.setSize(1000, 1000);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gamemain panel = new gamemain();
panel.addKeyListener(new listener());
panel.addMouseListener(new mouselistener());
panel.setBackground(Color.WHITE);
panel.setOpaque(true);
Container pane = gui.getContentPane();
pane.add(panel);
gui.setVisible(true);
panel.requestFocus();
}
});
}
}
I'd then focus on having the ability to pass more information to the gamemain
class, like the worldszie
and world
properties for example. 然后我专注于能够将更多信息传递给
gamemain
类,例如worldszie
和world
属性。
I'd also consider using the Key Bindings API over KeyListener
, it will help solve the focus related issues with KeyListener
我还考虑在
KeyListener
使用Key Bindings API ,它将有助于解决与KeyListener
相关的焦点问题
I'd also recommend having a look at Code Conventions for the Java Programming Language - it will make it easier for other people to read your code and for you to read theirs 我还建议您查看Java编程语言的代码约定 - 这将使其他人更容易阅读您的代码并让您阅读他们的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.