私はいくつかの NetBeans プラットフォーム アプリケーションに取り組んでおり、現在、Visual Library の詳細に行き詰まっています。わかりました、ここに問題があります。アプリ用のビジュアル エディターがあり、パレット、シーン、すべてがうまく機能しますが、アイコンをパレットからシーンにドラッグするときに問題が発生します。それらはドラッグイベント中に表示されません。その効果を作成したいのですが、誰か助けてもらえますか?
2 に答える
これを 2 つのフェーズで行います。
1) パレット要素のスクリーンショット (画像) を作成します。スクリーンショットを遅延して作成し、ビュー内にキャッシュします。スクリーンショットを作成するには、次のスニペットを使用できます。
screenshot = new BufferedImage(getWidth(), getHeight(), java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE);// buffered image
// creating the graphics for buffered image
Graphics2D graphics = screenshot.createGraphics();
// We make the screenshot slightly transparent
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));
view.print(graphics); // takes the screenshot
graphics.dispose();
2) 受信ビューにスクリーンショットをペイントします。ドラッグ ジェスチャが認識されたら、スクリーンショットを受け取るビューまたはその先祖の 1 つで利用できるようにする方法を見つけます (スクリーンショットのドラッグを利用できるようにする場所に応じて、フレームまたはそのコンテンツ ペインで利用できるようにすることができます)。そしてペイントメソッド内で画像をペイントします。このようなもの:
a. スクリーンショットを利用できるようにします。
capturedDraggedNodeImage = view.getScreenshot(); // Transfer the screenshot
dragOrigin = SwingUtilities.convertPoint(e.getComponent(), e.getDragOrigin(), view); // locate the point where the click was made
b. マウスをドラッグすると、スクリーンショットの位置が更新されます
// Assuming 'e' is a DropTargetDragEvent and 'this' is where you want to paint
// Convert the event point to this component coordinates
capturedNodeLocation = SwingUtilities.convertPoint(((DropTarget) e.getSource()).getComponent(), e.getLocation(), this);
// offset the location by the original point of drag on the palette element view
capturedNodeLocation.x -= dragOrigin.x;
capturedNodeLocation.y -= dragOrigin.y;
// Invoke repaint
repaint(capturedNodeLocation.x, capturedNodeLocation.y,
capturedDraggedNodeImage.getWidth(), capturedDraggedNodeImage.getHeight());
c. ペイント メソッドでスクリーンショットをペイントします。
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2.drawImage(capturedDraggedNodeImage, capturedNodeLocation.x,
capturedNodeLocation.y, capturedDraggedNodeImage.getWidth(),
capturedDraggedNodeImage.getHeight(), this);
}
repaint() を呼び出して paint() メソッドでペイントを実行する代わりに、マウスの動きに合わせて paintImmediately() を呼び出すこともできますが、レンダリングはかなり悪くなり、ちらつきが観察される可能性があるため、このオプションはお勧めしません。paint() と repaint() を使用すると、ユーザー エクスペリエンスが向上し、レンダリングがスムーズになります。
よく聞いていると思いますが、要素のドラッグアンドドロップを使用して、ある種のグラフィックエディタを作成していて、そのドラッグアンドドロップ中にエフェクトを作成したいですか?
その場合、基本的に、ドラッグしているオブジェクトのゴーストを作成し、それをマウスの動きにアタッチする必要があります。もちろん、言うのは簡単ですが、要点はわかります。したがって、必要なのは、ドラッグしているものの画像を取得し(それほど問題にはならないはずです)、マウスの位置に応じて移動することです(オブジェクト内のマウスカーソルの相対位置を差し引くことを考えてください)。 '再ドラッグ)。
しかし、そのようなコードはどこかで入手できると思います。それを調べることをお勧めします:http:
//free-the-pixel.blogspot.fr/2010/04/ghost-drag-and-drop-over-multiple.html
http://codeidol.com/java / swing / Drag-and-Drop / Translucent-Drag-and-Drop /
それがあなたを助けることを願っています!