1

Java2D で異なる BufferedImages をマウスドラッグするにはどうすればよいですか?

たとえば、10 個以上の画像がある場合、マウスが置かれている画像を移動するにはどうすればよいですか?

今、私は BufferedImage をインポートしています

BufferedImage img = new BufferdImage(new File("filename"));

そして、これをGraphics2Dでペイントしています

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    g2d.drawImage(img, x1, y1, null);
    g2d.drawImage(img2, x2, y2,null);
}

画像上を移動するたびに、画面全体を repaint() しています。私のマウスムーブクラスは次のとおりです

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        x1 = e.getX() - (img.getWidth() / 2);
        y1 = e.getY() - (img.getHeight() / 2);
        repaint();
    }
}

この方法で 1 つの画像を「ドラッグ」することはできますが、さらに個別にドラッグする場合はどうすればよいでしょうか?

4

6 に答える 6

2

BufferedImageを使用して、JLabelの作成に使用するImageIconを作成します。次に、nullレイアウトを使用するパネルにJLabelを追加します。これを行うためにカスタムペイントコードは必要ありません。

これで、ラベルをドラッグしたい場合は、コンポーネントムーバーを使用できます。

于 2010-04-09T15:19:37.647 に答える
1

画像を 1 つだけ含むカスタム コンポーネントを作成してみることができます。ペイントとマウスの動きを処理するコードとともに、コンポーネントは contains メソッドをオーバーライドして、座標が画像内にある場合にのみ true を返すようにします。

次に、これらのコンポーネントが JLayeredPane にスタックされ、(うまくいけば) マウスが上にある画像のみが移動します。

于 2010-04-09T10:44:13.633 に答える
0

あなたの質問から、あなたの現在の再描画ロジックはグローバルであると思います。あなたが持っているすべての画像にそれを適用する必要があります。したがって、たとえば、すべての画像をそのようなすべてのパネルにJPanel添付MouseMotionListenerして表示し、このロジックをで実行する場合JPanel

より多くのコード(特に画像を表示するコンポーネント)を投稿すると、詳細を確認できるようになります。

于 2010-04-09T10:39:18.957 に答える
0

ツリー配列を作成する必要があります。

  1. x値用に1つ
  2. y値用に1つ
  3. 1つはBufferedImages用です

だから、このようなもの:

int[] xValues = new int[10];
int[] yValues = new int[10];
BufferedImage[] imgs = new BufferedImage[10];

そうして

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        for (int i = 0; i < 10; i++)
        {
            xValues[i] = e.getX() - (imgs[i].getWidth() / 2);
            yValues[i] = e.getY() - (imgs[i].getHeight() / 2);
        }
        repaint();
    }
}

次に、次のようにペイントします。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    for (int i = 0; i < 10; i++)
    {
        g2d.drawImage(imgs[i], xValues[i], yValues[i], null);
    }
}

このようなものが必要だと思います。

于 2010-04-09T11:46:44.653 に答える
0

これが私のJLayeredPaneinitのコードです。ここでの私の問題は、私の画像が表示されないことです...

layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new java.awt.Dimension(500, 410));
layeredPane.setBorder(javax.swing.BorderFactory.createTitledBorder(
                                "Center deck"));
for(BufferedImage imgs : images){
   JLabel label = new JLabel(new ImageIcon(imgs));
   layeredPane.add(label, JLayeredPane.DEFAULT_LAYER);
}
add(layeredPane);
于 2010-04-14T11:33:14.417 に答える
0

以下は、単一選択または複数選択のドラッグを実装する簡単な例です。オブジェクトNodeは、オブジェクトにほぼ対応しますCard

補遺:関連する質問に対するこの回答で言及されているオーバーラップ レイアウトも考慮されます。の代わりに、プログラムは を管理します。ここで、それぞれがカード イメージを持っています。List<Node>List<Card>CardJLabel

于 2010-04-09T10:43:10.967 に答える