キャンバスに貼り付けたいオブジェクトを含むツールバーがあるJavaでペイントエディタを作成しようとしています。Swingコンポーネントを使用してGUIを作成していますが、キャンバスの作成方法を探したところ、AWTのクラスキャンバスしか見つかりませんでした。
Swingでキャンバスに似たものを作る方法はありますか?(たとえば、JPanel?)Swingで作成されたGUIでAWTのクラスキャンバスを使用すると正しく機能しないことを読みましたが、それは本当ですか?
キャンバスに貼り付けたいオブジェクトを含むツールバーがあるJavaでペイントエディタを作成しようとしています。Swingコンポーネントを使用してGUIを作成していますが、キャンバスの作成方法を探したところ、AWTのクラスキャンバスしか見つかりませんでした。
Swingでキャンバスに似たものを作る方法はありますか?(たとえば、JPanel?)Swingで作成されたGUIでAWTのクラスキャンバスを使用すると正しく機能しないことを読みましたが、それは本当ですか?
Swing でカスタム 'Canvas' を作成するには、通常、a のサブクラスを作成しJPanel
ます。protected paintComponent(Graphics g)
次に、 のメソッドを上書きする必要がありますJPanel
。
paint メソッドでは、Graphics
オブジェクトのメソッドを呼び出して、実際に に描画できますJPanel
。
いつものように、Java チュートリアルには、これを始めるための優れたリファレンスがあります。
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の記事に記載されています。
単にサブクラスJComponent
。
JPanel
不適切なクラスです。setOpaque(true)
自動的に呼び出されたように見えるため、よく提案されます。それを行うのは実際にはPL&Fであり、実際に発生するかどうかは実装とベンダーに依存します。
Canvas
重量級のコンポーネントです。つまり、基盤となるウィンドウシステムによって制御されます。その結果、通常、zオーダーやクリッピングに関係なく、Swingコンポーネントの上に描画されます(スクロールペインに配置すると、奇妙な動作になります)。
Minueto API を参照してください。グラフィック API を使用するのは非常に簡単で、Java イベント リッスンを組み合わせて描画機能を提供できます。