29

キャンバスに貼り付けたいオブジェクトを含むツールバーがあるJavaでペイントエディタを作成しようとしています。Swingコンポーネントを使用してGUIを作成していますが、キャンバスの作成方法を探したところ、AWTのクラスキャンバスしか見つかりませんでした。

Swingでキャンバスに似たものを作る方法はありますか?(たとえば、JPanel?)Swingで作成されたGUIでAWTのクラスキャンバスを使用すると正しく機能しないことを読みましたが、それは本当ですか?

4

4 に答える 4

47

Swing でカスタム 'Canvas' を作成するには、通常、a のサブクラスを作成しJPanelます。protected paintComponent(Graphics g)次に、 のメソッドを上書きする必要がありますJPanel

paint メソッドでは、Graphicsオブジェクトのメソッドを呼び出して、実際に に描画できますJPanel

いつものように、Java チュートリアルには、これを始めるための優れたリファレンスがあります。

于 2009-04-22T08:36:42.127 に答える
20

JPanelパネルに描画するコンポーネントをペイントする独自の方法のサブクラスを作成して実装することをお勧めします。

基本的なアプローチは、おそらくMouseListener、のサブクラスにを割り当ててから、JPanelペイント機能を実装するというものです。

基本的な考え方は、次のようなものかもしれません。

class MyCanvas extends JPanel implements MouseListener
{
    Image img;      // Contains the image to draw on MyCanvas

    public MyCanvas()
    {
        // Initialize img here.
        this.addMouseListener(this);
    }

    public void paintComponent(Graphics g)
    {
        // Draws the image to the canvas
        g.drawImage(img, 0, 0, null);
    }

    public void mouseClicked(MouseEvent e)
    {
        int x = e.getX();
        int y = e.getY();

        Graphics g = img.getGraphics();
        g.fillOval(x, y, 3, 3);
        g.dispose();
    }

    // ... other MouseListener methods ... //
}

上記の例は不完全です(テストされていません-間違いなくコンパイルされません)がMyCanvas、ユーザーがクリックして円を描くことができるクラスを実装する方法についてのアイデアを提供します。

オブジェクトは、キャンバスのimg画像を保持するために使用されます。このメソッドは、オブジェクトをキャンバスpaintComponentにペイントするために使用されます。imgこのmouseClickedメソッドでは、Graphics関連付けられているオブジェクトをimg取得しfillOvalて画像に表示します。

要件の1つは画像をキャンバスに貼り付けることなので、Image貼り付けたい画像をいくつか保持しておくことをお勧めします。おそらく、次のようなものです。

Image[] myImages;    // Used to store images to paint to screen.

img次に、に保存されている画像をペイントするルーチンでMyCanvas

g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null);

drawImageオブジェクトのメソッドを使用することによりGraphics、他Imageのsをsに描画できますImage


AWTとSwingに関する質問については、そうです。GUIコンポーネントのレンダリング方法が異なるため、AWTとSwingのコンポーネントを混在させたくないのは事実です。AWTはヘビーウェイトコンポーネントに基づいています。つまり、GUIをペイントするためのネイティブウィンドウです。Swingはライトウェイトコンポーネントに基づいています。つまり、GUIはネイティブコンポーネントを使用せずにJava自体によって描画されます。

AWTとSwingの違いに関する優れたガイドは、 SunのPainting in AWTandSwingの記事に記載されています。

于 2009-04-22T08:27:28.763 に答える
13

単にサブクラスJComponent

JPanel不適切なクラスです。setOpaque(true)自動的に呼び出されたように見えるため、よく提案されます。それを行うのは実際にはPL&Fであり、実際に発生するかどうかは実装とベンダーに依存します。

Canvas重量級のコンポーネントです。つまり、基盤となるウィンドウシステムによって制御されます。その結果、通常、zオーダーやクリッピングに関係なく、Swingコンポーネントの上に描画されます(スクロールペインに配置すると、奇妙な動作になります)。

于 2009-04-22T09:59:58.057 に答える
2

Minueto API を参照してください。グラフィック API を使用するのは非常に簡単で、Java イベント リッスンを組み合わせて描画機能を提供できます。

http://minueto.cs.mcgill.ca/

于 2009-04-30T14:02:31.733 に答える