g.drawLine什么都不做

时间:2013-02-08 04:46:57

标签: java swing drawing jpanel

到目前为止,这是我的代码,其中包含一些打印行,以确保它实际上甚至可以进入该方法。出于某种原因,在画布上绘制了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
  }
}

2 个答案:

答案 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中执行此操作,请考虑使用JPanelCanvas

相关问题