web-dev-qa-db-ja.com

Canvasを使用したJavaの描画

JavaのCanvasで描画したいのですが、何をしているのかわからないため、動作しません。これが私の簡単なコードです。

import javax.swing.JFrame;
import Java.awt.Canvas;
import Java.awt.Graphics;
import Java.awt.Color;

public class Program
{
    public static void main(String[] args)
    {
        JFrame frmMain = new JFrame();
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setSize(400, 400);

        Canvas cnvs = new Canvas();
        cnvs.setSize(400, 400);

        frmMain.add(cnvs);
        frmMain.setVisible(true);

        Graphics g = cnvs.getGraphics();
        g.setColor(new Color(255, 0, 0));
        g.drawString("Hello", 200, 200);
    }
}

ウィンドウに何も表示されません。

Canvasは紙で、Graphicsは私の鉛筆だと思うのは間違っていますか?それはどのように機能しますか?

13
dpp

提案:

  • AWTとSwingコンポーネントを不必要に混在させるべきではないため、Canvasは使用しないでください。
  • 代わりに、JPanelまたはJComponentを使用してください。
  • 取得されたGraphicsオブジェクトは一時的なものになるため、コンポーネントでgetGraphics()を呼び出してGraphicsオブジェクトを取得しないでください。
  • JPanelのpaintComponent()メソッドで描画します。
  • これはすべて、簡単に見つかるいくつかのチュートリアルで説明されています。このようなことを推測する前に、まずそれらを読んでみませんか?

主要なチュートリアルリンク:

CanvasのPaint(Graphics g)メソッドをオーバーライドして、そこで描画を実行する必要があります。 Paint()のドキュメントを参照してください。

述べているように、デフォルトの操作はキャンバスをクリアすることであるため、キャンバスのグラフィックスオブジェクトへの呼び出しは期待どおりに実行されません。

7
Tom G

最初の方法が機能しないのはなぜですか。 Canvasオブジェクトが作成され、サイズが設定され、グラフィックが設定されます。私はいつもこれを奇妙に感じます。また、クラスがJComponentを拡張する場合は、オーバーライドできます

_paintComponent(){
  super...
}
_

そして、あなたは別のクラス内でクラスのインスタンスを作成し、それからただNewlycreateinstanceOfAnyClass.repaint();を呼び出すことができるべきではありません

私はこれまで取り組んできたいくつかのゲームプログラミングでこのアプローチを試しましたが、本来あるべきだと思うように動作しないようです。

ダグ・ハウフ

1
doug hauf

以下が動作するはずです:

public static void main(String[] args)
{
    final String title = "Test Window";
    final int width = 1200;
    final int height = width / 16 * 9;

    //Creating the frame.
    JFrame frame = new JFrame(title);

    frame.setSize(width, height);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);

    //Creating the canvas.
    Canvas canvas = new Canvas();

    canvas.setSize(width, height);
    canvas.setBackground(Color.BLACK);
    canvas.setVisible(true);
    canvas.setFocusable(false);


    //Putting it all together.
    frame.add(canvas);

    canvas.createBufferStrategy(3);

    boolean running = true;

    BufferStrategy bufferStrategy;
    Graphics graphics;

    while (running) {
        bufferStrategy = canvas.getBufferStrategy();
        graphics = bufferStrategy.getDrawGraphics();
        graphics.clearRect(0, 0, width, height);

        graphics.setColor(Color.GREEN);
        graphics.drawString("This is some text placed in the top left corner.", 5, 15);

        bufferStrategy.show();
        graphics.dispose();
    }
}
1
Llewv