2

2 つの質問があります。

  1. [解決しよう] - Java では、マウス リスナーを使用して画像内を移動できます。ポインタがある場所に画像を正確に移動する代わりに、マウスをクリックして上に移動すると、画像が上に移動するようにするにはどうすればよいですか。マウス ポインターがある場所に画像をジャンプさせないでください。

  2. [解決しよう] - エディターを作成しているので、移動できるウィンドウに複数の画像がある場合、2 つの画像が重なっている場合、どの画像を実際に移動する必要があるかをどのように検出すればよいですか。前の画像の代わりに画像の後ろに移動したい場合、またはその逆の場合はどうなりますか。ここで皆さんが行った最善の方法は何ですか。

これらの質問の両方に関連するコード

addMouseMotionListener(new MouseMotionListener() {

        @Override
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void mouseDragged(MouseEvent arg0) {
            // TODO Auto-generated method stub
            //use this
            if(curObj != null){

                Point p = arg0.getPoint();

                curObj.pos.x = p.x;
                curObj.pos.y = p.y;

                ......
            }
        }
    });


addMouseListener(new MouseListener() {

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
            //right now find the first one that contains the mouse.
            //later we can make it so they have an option to pick on that overlaps.

            Point p = arg0.getPoint();
            SwingUtilities.convertPoint(Main.gui, p, instance);

                            ....

                            //this is the code to detect which image to use
            curObj = null;
            for(int i = 0; i < objects.size(); i++){
                StepObject obj = objects.get(i);
                if(obj.isDraggable()){
                    if(p.x >= obj.pos.x && p.y >= obj.pos.y &&
                       p.x <= (obj.pos.x + obj.getWidth()) && p.y <= (obj.pos.y + obj.getHeight())){
                        curObj = obj;
                        break;
                    }
                }
            }

            .....

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
    });

フィードバックをお待ちしております。

ありがとう。

4

2 に答える 2

3

実際に使っGraphicsて絵を描いています。

これは、最も初期の広く利用可能なオブジェクト描画プログラムにまでさかのぼるユーザー インターフェースの問題でした。一般的なアプローチは、ユーザーが非表示のオブジェクトを表示順序を変更して公開できるようにする 2 つの基本的な操作を実装することです。

  • 後方に移動: 選択範囲をzオーダーで 1 ステップ戻します。
  • 背面に移動: 選択範囲をzオーダーの背面に移動します。

通常、次の 2 つの補完的な操作が含まれます。

  • 前方に移動: 選択範囲をzオーダーで 1 ステップ進めます。
  • 前に移動: 選択範囲をzオーダーの前に移動します。

GraphPanelJava 2D でヒット テストと複数選択を処理するためのいくつかの手法を示します。これは、オブジェクトの少なくとも一部が表示されている単純なケースを示しています。そのレンダリング順序は、 をList<Node>使用した単純なモデルによって定義されArrayListます。これは再順序付けには理想的ではありません。インターフェイスLinkedListの代替実装として検討してください。List

于 2012-07-11T22:54:00.503 に答える
1

解決策の 1 つのタイプは、チェス盤でこれをどのように解決したかです。ボードは、それぞれが 1 つまたは 0 つの JLabel (画像付きのチェスの駒を保持する) を保持できる JPanel のグリッドで構成されます。JLabel を保持する JPanel をクリックすると、JLabel がトップ レベル ウィンドウのガラス枠に移動し、マウスでドラッグされます。マウスが離されると、MouseListener がグリッドのどの JPanel の上にあるかを検出し、チェス エンジンがこれが有効な動きかどうかを判断し、そうであれば、マウス カーソルが上にある JPanel に JLabel を追加します。そうでない場合、JLabel は元の JPanel に戻ります。JPanel は GridBagLayout を使用するため、JLabel が追加されると、JPanel セルの中央に表示されます。

于 2012-07-11T18:39:24.087 に答える