到目前为止,这是我的代码,其中包含一些打印行,以确保它实际上甚至可以进入该方法。出于某种原因,在画布上绘制了NOTHING,就绘图而言,我有一个与此类似的程序,它工作正常。这个有什么问题?
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
}
}
答案 0 :(得分:2)
让我们从g=frame.getGraphics();
这是一个非常糟糕的主意,而不是如何执行自定义绘画。 getGraphics
可能会返回null
,通常只是最后一个绘制周期的快照。通过此方法绘制到Graphics
上下文的任何内容都将在下一个重绘周期中被销毁。
您永远不应该保留对任何Graphics
上下文的引用,它们是瞬态的,并且可能不是绘制周期之间的对象
相反,创建一个自定义组件(类似JPanel
)并覆盖它的paintComponent
方法
查看Performing Custom Painting了解详情
<强>更新强>
您可以查看此simple example的想法......
答案 1 :(得分:0)
您可以在画布中覆盖paint(Graphics g)
,否则绘图将在画布失效后消失(例如移动或被其他窗口覆盖)。
让您的类扩展JFrame
并覆盖paint
方法可能更容易,否则您可以使用匿名类,例如
frame = new JFrame("Keegan's Game Of Life") { //override paint here }
但是,如果您的应用程序旨在为Game Of Life创建动画,则不应在JFrame中执行此操作,请考虑使用JPanel
或Canvas