我现在已经工作了大约四个小时了。我有所有逻辑下来,计时器工作,键盘和鼠标输入工作,但paintComponent方法不被调用来绘制更新!我对这些实时应用程序没有经验,所以它可能是导致这种情况无法工作的任何因素。任何帮助将不胜感激!
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
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;
}
}
}
}
}
答案 0 :(得分:3)
paintComponent
从未被调用,因为gamemain
实际上从未添加到任何能够显示的内容。
您的首要任务是取消对static
或许更像是......
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();
}
});
}
}
然后我专注于能够将更多信息传递给gamemain
类,例如worldszie
和world
属性。
我还考虑使用Key Bindings API而不是KeyListener
,它将有助于解决与KeyListener
我还建议您查看Code Conventions for the Java Programming Language - 它会让其他人更轻松地阅读您的代码并让您阅读他们的代码