坚持Java Swing项目:Conway的生命游戏

时间:2017-05-09 00:35:05

标签: java swing graphics drawing rendering

我现在已经工作了大约四个小时了。我有所有逻辑下来,计时器工作,键盘和鼠标输入工作,但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;

            }

        }
    }

}

}

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类,例如worldszieworld属性。

我还考虑使用Key Bindings API而不是KeyListener,它将有助于解决与KeyListener

相关的焦点问题

我还建议您查看Code Conventions for the Java Programming Language - 它会让其他人更轻松地阅读您的代码并让您阅读他们的代码