到目前为止,这是我的代码,其中包含一些打印行,以确保它实际上甚至已经进入方法中。由于某种原因,画布上未绘制“什么”,我有一个与此程序类似的程序,它可以正常工作。这是怎么了?

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;

public class gameOfLife implements ActionListener {
  private int height;
  private int width;
  private Graphics g;
  private JPanel panel;
  private JFrame frame;
  int[][] board= new int[40][40];

  /**
  * @param args
  */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    gameOfLife gui = new gameOfLife();
  }

  public gameOfLife() {
    int height=400;
    int width=400;
    frame= new JFrame("Keegan's Game Of Life");
    frame.setSize(new Dimension(height,width));
    frame.setLayout(new BorderLayout());
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
    g=frame.getGraphics();
    drawBoard();
  }

  public void drawBoard() {
    g.setColor(Color.BLUE);
    g.drawLine(0, 0, 50, 50);
    g.fillOval(50,50,10,10);
    System.out.println("Done Drawing");
    g.drawString("IT WORKED!", 100, 100);
  }

  @Override
  public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
  }
}

最佳答案

让我们从g=frame.getGraphics();开始

这是一个非常糟糕的主意,而不是如何执行自定义绘画。 getGraphics可能返回null,并且通常只是最后一次绘制周期的快照。通过此方法绘制到Graphics上下文的任何内容都将在下一个重新绘制周期中销毁。

您永远不要维护对任何Graphics上下文的引用,它们是瞬时的,在绘制周期之间可能不是同一对象

相反,请为您自己创建一个自定义组件(类似于JPanel)并覆盖它的paintComponent方法

查看Performing Custom Painting了解更多详细信息

更新

您可以查看simple example这个想法...

10-04 10:39