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