Не удается запустить метод рисования из основного метода - PullRequest
1 голос
/ 11 августа 2011

В основном методе я пытаюсь запустить это:

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 ]

1 голос
/ 11 августа 2011

Где вы хотите рисовать? Я предполагаю, что вы, вероятно, хотите рисовать в окне на экране, и в этом случае вы не будете вызывать paint * самостоятельно, вы позволите инфраструктуре Swing вызывать его в соответствующее время. В этом случае, если game является JFrame, вам просто нужно сделать его видимым; или если 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
  }
}

Если вы хотите нарисовать изображение вне экрана, вам нужно создать собственный графический контекст для передачи в методы рисования *:

BufferedImage hello = new BufferedImage(game.getWidth(), game.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = hello.getGraphics();
game.paintBlocks( g );
1 голос
/ 11 августа 2011

В случае paintBlocks, g - это параметр, который передается в метод. В случае main, g ссылается на переменную, которая нигде не была создана.

Graphics и Graphics2D являются абстрактными классами и обычно не предназначены для создания экземпляров, кроме Swing. Graphics и Graphics2D дают вам контекст для рисования на компоненте (например, JPanel или BufferedImage).

Исходя из вашего описания, вы, вероятно, захотите рисовать блоки на каком-либо компоненте Swing. (Хотя это немного неясно, это было бы нормально, если бы вы рисовали блоки на JPanel, например, создав класс, который расширяет * 1018. * и переопределить метод 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);
   }
}

Есть еще один пример, который может помочь вам на стр. 9 этого документа. Также могут помочь Учебники по Java для Java 2D API .

0 голосов
/ 11 августа 2011

Переменная 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
}

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...