質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

別のファイルで作ったGraphicsクラスをつかったメソッドをMainクラスのmainメソッドで使えない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 186

BoardクラスのdrawBoardメソッドをMainクラスのmainメソッドで呼び出したところ、
以下のようなエラーが起きました。

外部のサイトを参考にGraphicsオブジェクトを使おうとしましたが
他のオブジェクトのようにnewを用いて新しくオブジェクトを生成せず、
public static void drawBoard(Graphics g) {
}
のように仮引数を入れる場所に記述する理由がわかりません。
そこらへんの動作もできれば、詳しく説明していただくとありがたいですm(__)m

エラー内容

MacBook-Pro-2 othello % javac Board.java Main.java
Main.java:8: エラー: クラス Boardのメソッド drawBoardは指定された型に適用できません。
        Board.drawBoard();
             ^
  期待値: Graphics
  検出値:    引数がありません
  理由: 実引数リストと仮引数リストの長さが異なります
エラー1個

Main.java

public class Main {
  public static void main(String args[]) {

    // 配列を初期化
    Board.initBoard();
    // オセロ版を初期化
    Board.drawBoard();

  }
}

Board.java

import java.awt.Graphics;
import java.awt.Color;
public class Board {

    // フィールド(クラスブロック内に宣言された変数)宣言
    public static final int blank = 0;
    public static final int width = 8;
    public static final int height = 8;
    public static final int gs = 1;
    public static int[][] board = new int[height][width];

    // オセロ盤を初期化するメソッド
    public static void initBoard() {
        for(int i = 0; i < height; i++) {
            for(int a = 0; i < width; i++) {
                board[i][a] = blank;
            }
        }
    }

    // オセロ盤を描画するメソッド
    public static void drawBoard(Graphics g) {

        // 色を指定
        g.setColor(new Color(0,128,128));
        // マス全体を塗りつぶす
        g.fillRect(0, 0,width,height);

        // 縦横に線を引き、マス目を描画する
        g.setColor(Color.black);
        for(int i = 0; i < height; i++) {
            // 縦線を引く
            // g.drawLine(startX,startY,endX,endY);
            g.drawLine(gs*i,0,gs*i,height);
        }
        for(int i = 0; i < width; i++) {
            // 横線を引く
            // g.drawLine(startX,startY,endX,endY);
            g.drawLine(0,gs*i,width,gs*i);
        }
        // 外枠(矩形)を描画
        g.drawRect(0,0,width,height);

    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

mainから呼び出す際に描画エリアを表すGraphics gを引数に入れていないからです。
Appletを継承するなり、Frameを継承するなりして描画エリアを作る必要があります。

そこは他のサンプルコードから引っ張ってきて、改良していったほうが早いですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 16:00

    すみません。
    入れ方あってますか?

    Main.java:8: エラー: ')'がありません
    Board.drawBoard(Graphics g);
    ^
    Main.java:8: エラー: 文ではありません
    Board.drawBoard(Graphics g);
    ^
    Main.java:8: エラー: ';'がありません
    Board.drawBoard(Graphics g);
    ^
    エラー3個

    キャンセル

  • 2020/07/13 16:30

    このプログラムにはどこにも「描画エリア」がないので単にGraphics g を追記しても意味ありませんよ。
    アプレットとして作りたいのか、アプリケーションとして作りたいのかでも変わってきますので。
    今の作りとしてはアプリケーションのほうが近いのでそちらを参考にサンプルを動かしてみてください。

    アプリケーションのサンプル
    https://cc.musabi.ac.jp/kenkyu/cf/program/j03.html

    アプレットのサンプル
    https://www.javadrive.jp/applet/graphics/index4.html

    キャンセル

0

こんなことがしたいのかな?

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Main extends JFrame {
    public static final int blank = 0, black = 1, white = 2;
    public static final int width = 8, height = 8;
    public static final int gs = 80;
    public int[][] board = new int[height][width];

    public static void main(String[] args) { new Main(); }

    Main() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(650, 680);
        setTitle("Othello");
        setLocationRelativeTo(null);
        setResizable(false);
        add(new Board());    //描画領域の追加
        setVisible(true);
        initBoard();
    }

    void initBoard() {
        for (int i = 0; i < height; i++)
            for (int j = 0; j < width; j++)
                board[i][j] = blank;
        board[3][4] = board[4][3] = black;
        board[3][3] = board[4][4] = white;
    }

    class Board extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(new Color(0, 128, 128));    // 色を指定
            g.fillRect(0, 0, gs * width, gs * height); // 全体を塗りつぶす
            g.setColor(Color.black);
            for (int i = 0; i < height; i++)
                g.drawLine(gs * i, 0, gs * i, gs * height); // 縦線を引く
            for (int i = 0; i < width; i++)
                g.drawLine(0, gs * i, gs * width, gs * i);  // 横線を引く
            g.drawRect(0, 0, gs * width, gs * height); // 外枠(矩形)を描画
            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    int b = board[i][j];
                    if (b != blank) {
                        g.setColor(b == black ? Color.black : Color.white);
                        g.fillOval(gs*i+4, gs*j+4, gs-8, gs-8);
                    }
                }
            }
        }
    }
}


追記
ファイルを Main.java と Board.java に分割できるように
class Board を独立させました。
マウスボタンをクリックしたときの処理を追加してみました。

import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Main extends JFrame {

    public static void main(String[] args) { new Main(); }

    Main() {
        setSize(650, 680);
        setTitle("Othello");
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE); // [x]ボタンで終了
        add(new Board());    // 描画領域の追加
        setVisible(true);
    }
}

class Board extends JPanel {
    static final int blank = 0, black = 1, white = 2;
    static final int width = 8, height = 8;
    static final int gs = 80;

    int[][] board = new int[height][width];
    int turn = black;

    Board() {
        for (int i = 0; i < height; i++)
            for (int j = 0; j < width; j++) board[i][j] = blank;
        board[3][3] = board[4][4] = white;
        board[3][4] = board[4][3] = black;

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                int x = e.getX() / gs, y = e.getY() / gs;
                if (x < 8 && y < 8) {
                    board[x][y] = turn;
                    turn = black + white - turn;
                    repaint();
                }
            }
        });
    }

    public void paintComponent(Graphics g) {
        g.setColor(new Color(0, 128, 128));    // 色を指定
        g.fillRect(0, 0, gs * width, gs * height); // 全体を塗りつぶす

        g.setColor(Color.black);
        for (int i = 0; i < height; i++)
            g.drawLine(gs * i, 0, gs * i, gs * height); // 縦線を引く
        for (int i = 0; i < width; i++)
            g.drawLine(0, gs * i, gs * width, gs * i);  // 横線を引く
        g.drawRect(0, 0, gs * width, gs * height); // 外枠(矩形)を描画

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int piece = board[i][j];
                if (piece != blank) {
                    g.setColor(piece == black ? Color.black : Color.white);
                    g.fillOval(gs * i + 4, gs * j + 4, gs - 8, gs - 8);
                }
            }
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • 別のファイルで作ったGraphicsクラスをつかったメソッドをMainクラスのmainメソッドで使えない