无法从main方法运行paint方法

时间:2011-08-10 22:47:42

标签: java object

在main方法中,我试图运行它:

public static void main(String[] args)
{
    game.paintBlocks(g);
}

为“g”参数获取“无法解析为变量”错误。

在其他地方我有这个,它调用另一个类中的另一个方法(paint(g))来绘制一个块网格:

public void paintBlocks(Graphics g)
{  
    for (int r = 0; r<7; r++)
    {
        for (int c = 0; c<5; c++)
        {
            block[r][c].paint(g);
        }
    }

我是否需要告诉它“g”在另一个班级?我是新手,任何帮助都会很棒!

3 个答案:

答案 0 :(得分:1)

paintBlocks的情况下,g是传递给方法的参数。在main的情况下,g引用了一个尚未在任何地方创建的变量。

GraphicsGraphics2D是抽象类,除了Swing之外,通常不打算实例化。 GraphicsGraphics2D给出的是绘制组件的上下文(如JPanel或BufferedImage)。

根据您的描述,您可能希望在某种类型的Swing组件上绘制块。 (虽然有点不清楚,但这是正常的事情。)例如,如果你在JPanel上绘制块,通常要做的就是创建一个扩展的类JPanel并覆盖paintComponent()方法。你可能会这样做的一种方式:

public class BlocksPanel extends JPanel {
   // Normal class fields, etc.
   // ...

   // I would consider making this private, but this is your method from above:
   public void paintBlocks(Graphics g) {  
      for (int r = 0; r<7; r++) {
         for (int c = 0; c<5; c++) {
            block[r][c].paint(g);
         }
      }
   }

   @Override
   public void paintComponent(Graphics g) {
      paintBlocks(Graphics g);
   }
}

this document.的第9页还有另一个可能对您有所帮助的示例Java Tutorials for the Java 2D API也可以提供帮助。

答案 1 :(得分:1)

你想在哪里画画?我假设您可能想要在屏幕上绘制一个窗口,在这种情况下,您不会自己调用paint *,您将让Swing框架在适当的时候调用它。在这种情况下,如果gameJFrame,那么您只需要让它可见;或者如果game是其他类型的组件,那么您需要将其添加到可见窗口。这是我在用Java教授基本图形时通常使用的模式:

public class MyGame extends JPanel {
  public static void main() {
    JFrame window = new JFrame("My Game");
    window.add(new MyGame());
    window.pack();
    window.setLocationRelativeTo(null); // Centers the window on the screen
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible();
  }
  public Dimension getPreferredSize() {
    return new Dimension(800, 600);
  }
  protected void paintComponent(Graphics g) {
    // Do my drawing here
  }
}

如果要绘制到屏幕外图像,那么您需要创建自己的图形上下文以传递到paint *方法:

BufferedImage hello = new BufferedImage(game.getWidth(), game.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = hello.getGraphics();
game.paintBlocks( g );

答案 2 :(得分:0)

变量g在主上下文中未定义,因为您尚未声明/初始化它。如果您查看paintBlocks(Graphics g)方法,g将作为参数传递,但该变量(g)的范围在方法的大括号({})内paintBlocks(Graphics g)

如果你有一个名为MyClass的类扩展了一个组件,比如JPanel,你可以这样做:

class MyClass extends JPanel
{
     public static void main(String[] args)
     {
         Graphics g = getGraphics(); //would return the graphics object for the JPanel
         game.paintBlocks(g);
     }
}

还值得注意的是,在某些情况下,上述方法会被标记为错误的编程风格。还有另一种选择。您可以使用组件提供的paintComponent(Graphics g)方法。

你的主要看起来像这样:

public static void main(String[] args)
{
   repaint(); //this repaints the component, calling the paintComponent method
}

自己调用paintComponent(Graphics g)的编程风格也很糟糕。您应该允许系统调用该方法,这就是您使用repaint()方法的原因。重新绘制时,系统会自动调用paintComponent(Graphics g)

paintComponent(Graphics g)开始,您可以执行此操作:

public void paintComponent(Graphics g)
{
    super.paintComponent(g); //repainting the panel,not necessary in some cases
    game.paintBlocks(g); //passing the graphics object used by the component
}

希望有所帮助!